逐次平方の反復的プロセスバージョンを求めよ
発想の転換が必要。
b^n = (b^(n/2))^2 = (b^2)^(n/2) b^n = b * b^(n-1) [普通の逐次平方ならばこんな感じ] 2^6 = (2^3)^2 = 8^2 = 8 * 8 = 64 [反復プロセスで行うならばこうする] 2^6 = (2^3)^2 = (2^2)^3 --> n, a では無く、bを変えるのがポイント = 4^3 = 4 * 4^2
; 逐次平方 ; Θ(log n)ステップ、Θ(1)スペース (define (fast-expt2 b n) (define (iter b n a) (cond ((= n 0) a) ((even? n) (iter (square b) (/ n 2) a)) (else (iter b (- n 1) (* a b))))) (iter b n 1)) (define (even? n) (= (remainder n 2) 0)) (define (square x) (* x x))