Lispで加減乗除

tazantさん、トラックバックばっかりしてすみません。Lisp加減乗除(http://d.hatena.ne.jp/tazant/20080823/1219491744)が面白そうだったのでやってみました。

(define (minus x y)
  (+ x (- y)))

(define (mul x y)
  (letrec ((mul-aux 
	    (lambda (x y res)
	      (if (= y 0)
		  res
		  (mul-aux x (minus y 1) (+ res x))))))
    (mul-aux x y 0)))

(define (div x y)
  (letrec ((div-aux 
	    (lambda (x y res)
	      (if (< x y)
		  res
		  (div-aux (minus x y) y (+ res 1))))))
    (div-aux x y 0)))

(print (minus 4 32))
(print (mul 32 4))
(print (div 32 4))
gosh sisoku.scm
-28
128
8

割り算は、最初に習った定義どおり何回引けたか数えています。

掛け算を速くしてみました。

(define (mul-fast x y)
  (letrec 
      ((mul-aux
	(lambda (x y res step base)
	  (if (= y 0)
	      res
	      (if (< y step)
		  (mul-aux x y res 1 x)
		  (mul-aux x (minus y step) 
			   (+ res base)(+ step step) (+ base base)))))))
    (mul-aux x y 0 1 x)))

(print (time (mul 5 234423)))
(print (time (mul-fast 5 234423)))
;(time (mul 5 234423))
; real   0.042
; user   0.047
; sys    0.000
1172115
;(time (mul-fast 5 234423))
; real   0.000
; user   0.000
; sys    0.000
1172115