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