SICP問題1.18
(define (square n) (* n n)) (define (double n) (+ n n)) (define (halve n) (/ n 2)) (define (even? n) (= (remainder n 2) 0)) ; 1.16 のべき乗 (define (my-expt b n) (define (my-iter-expt b n a) (cond ((= n 0) a) ((even? n) (my-iter-expt (square b) (/ n 2) a)) (else (my-iter-expt b (- n 1) (* b a)))) ) (my-iter-expt b n 1) ) ; 1.17 の乗算 (define (my-* x y) (cond ((= y 0) 0) ((even? y) (double (my-* x (halve y)))) (else (+ x (my-* x (- y 1))))) )
これらの結果を使用して加算, 二倍, 二分による対数的ステップ数の二つの整数を乗算を行う反復的プロセスを工夫せよ。とのことなので
(define (my-iter-* x y) (define (iter x y a) (cond ((= y 0) a) ((even? y) (iter (double x) (halve y) a)) (else (iter x (- y 1) (+ a x)))) ) (iter x y 0) )
んーと1.16関係ないような気が…。