习题1.16
公式: b n = (b n/2 ) 2 = (b 2 ) n/2
(define (fast-expt b n)
(define (fast-expt-iter result b n)
(if (< n 2)
(* result b)
(if (odd? n)
(fast-expt-iter (* result b) (* b b) (/ (- n 1) 2))
(fast-expt-iter result (* b b) (/ n 2)))))
(fast-expt-iter 1 b n))
习题1.17
公式: a * b = (a * 2) * (b / 2)
;原型
(define (* a b)
(if (= b 0)
0
(+ a (* a (- b 1)))))
;解题
(define (double n) (* n 2))
(define (halve n) (/ n 2))
(define (fast-multi a b)
(define (fast-multi-iter result a b)
(if (< b 2)
(+ result a)
(if (odd? b)
(fast-multi-iter (+ result a) (double a) (halve (- b 1)))
(fast-multi-iter result (double a) (halve b)))))
(fast-multi-iter 0 a b))
习题1.18
同习题1.17
习题1.19
公式:
T n = (T 2 ) n/2
q’ = 2pq + q 2
p’ = p 2 +q 2
(define (fib n)
(fib-iter 1 0 0 1 n))
(define (fib-iter a b p q count)
(cond ((= count 0) b)
((even? count)
(fib-iter a
b
(+ (* p p) (* q q))
(+ (* 2 p q) (* q q))
(/ count 2)))
(else (fib-iter (+ (* b q) (* a q) (* a p))
(+ (* b p) (* a q))
p
q
(- count 1)))))