おやすみSICP
問題文を読めばよい
;;;q1.16 冪乗 ;;; $Id$ ;;;線形 (define (beki n c) (if (= c 0) 1 (* n (beki n (- c 1))) ) ) ;;(even? 2) ;;even?はあるらしい。 ;;(remainder hoge hoge)を使用せよとSICPにはあるが。 ;;;even?で省力するタイプ (define (square n) (* n n) ) (define (bekiH n c) (if (= c 0) 1 (if (even? c) (square (bekiH n (/ c 2))) (* n (bekiH n (- c 1))) ) ) ) ;;;反復 productを持つタイプ (define (bekiP n c) (beki-itr n c 1) ) (define (beki-itr n c p) (if (= c 0) p (beki-itr n (- c 1) (* n p)) ) ) (bekiP 2 3) ;;;反復+even?省力 (define (bekiHP n c) (beki-itr2 n c 1) ) (define (beki-itr2 n c p) (cond ((= c 0) p) ((even? c) (beki-itr2 (* n n) (/ c 2) p)) ;b**n == (b*b)**(n/2) (else (beki-itr2 n (- c 1) (* n p)))) ) (require (lib "trace.ss")) (trace beki) (trace bekiH) (trace bekiP) (trace bekiHP) (trace beki-itr) (trace beki-itr2) (- (+ (beki 2 16) (bekiHP 2 16)) (+ (bekiH 2 16) (bekiHP 2 16)))
(beki 2 16) (beki 2 15) (beki 2 14) (beki 2 13) (beki 2 12) (beki 2 11) (beki 2 10) (beki 2 9) (beki 2 8) (beki 2 7) [10](beki 2 6) [11](beki 2 5) [12](beki 2 4) [13](beki 2 3) [14](beki 2 2) [15](beki 2 1) [16](beki 2 0) [16]1 [15]2 [14]4 [13]8 [12]16 [11]32 [10]64 128 256 512 1024 2048 4096 8192 16384 32768 65536 (bekiHP 2 16) (beki-itr2 2 16 1) (beki-itr2 4 8 1) (beki-itr2 16 4 1) (beki-itr2 256 2 1) (beki-itr2 65536 1 1) (beki-itr2 65536 0 65536) 65536 (bekiH 2 16) (bekiH 2 8) (bekiH 2 4) (bekiH 2 2) (bekiH 2 1) (bekiH 2 0) 1 2 4 16 256 65536 (bekiHP 2 16) (beki-itr2 2 16 1) (beki-itr2 4 8 1) (beki-itr2 16 4 1) (beki-itr2 256 2 1) (beki-itr2 65536 1 1) (beki-itr2 65536 0 65536) 65536
わりと一目瞭然