ex 1.16
逐次平方なら
反復プロセスなら
(define (square x) (* x x))
(define (even? n) (= (remainder n 2) 0))
(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))gosh> (fast-expt2 2 3)
8ex 1.17
multipleの逐次平方
(define (double x) (* x 2))
(define (halve x) (/ x 2))
(define (even? n) (= (remainder n 2) 0))
(define (fast-mult a b)
(cond ((= b 0) 0)
((even? b) (double (fast-mult a (halve b))))
(else (+ a (fast-mult a (- b 1))))))gosh> (fast-mult 2 4)
8ex 1.18
multipleの反復プロセス
(define (double x) (* x 2))
(define (halve x) (/ x 2))
(define (even? n) (= (remainder n 2) 0))
(define (fast-mult2 a b)
(define (iter a b total)
(cond ((= b 0) total)
((even? b) (iter (double a) (halve b) total))
(else (iter a (- b 1) (+ total a)))))
(iter a b 0))ex 1.30
穴埋め問題
(define (sum term a next b)
(define (iter a result)
(if (> a b)
result
(iter (next a) (+ (term a) result))))
(iter a 0))ex 1.31
(define (even? n) (= (remainder n 2) 0))
(define (product term a next b)
(if (> a b)
1
(* (term a)
(product term (next a) next b))))
(define (pi n)
(define (term x)
(if (even? x)
(/ (+ x 2.0) (+ x 3.0))
(/ (+ x 3.0) (+ x 2.0))))
(* 4.0 (product term 0 (lambda (x) (+ x 1)) n )))gosh> (pi 1)
3.5555555555555554
gosh> (pi 10)
3.023170192001359
gosh> (pi 100)
3.1263793980429804
gosh> (pi 1000)
3.1400269461050057
gosh> (pi 10000)
3.1414356249916424
gosh> (pi 100000)
3.14157694613687