文責: | @naoiwata |
---|
乗算が無いと仮定する条件下において, \(a*b = a + a * (b - 1)\) を考える.
(define (* a b)
(if (= b 0)
0
(+ a (* a (- b 1)))))
double 演算と halve 演算使い, fast-expt と類似の対数的ステップ数の乗算手続きを考える問題.
まず前提として与えられた式を定義しておく.
(define (double x) (+ x x))
(define (halve x) (/ x 2))
与えられた以上の式を用いて乗算手続きを考えていく.
\(a*b\) において,
を S 式に置き換える.
(define (multi a b)
(cond ((= b 0) 0)
((even? b) (multi (double a) (halve b)))
(else (+ a (multi a (- b 1))))))
(define (double x) (+ x x))
(define (halve x) (/ x 2))
(define (multi a b)
(cond ((= b 0) 0)
((even? b) (multi (double a) (halve b)))
(else (+ a (multi a (- b 1))))))
(multi 7 8)
;; => 56
また, この例であげた (multi 7 8) の計算ステップは以下のようになる.