(define(do-expt b n)(cond((> n 0)(fast-expt b b n))((= n 0) 1)(else(/ 1(fast-expt b b (- 0 n))))
)
)(define(even? n)(=(remainder n 2) 0))(define(fast-expt a b n)( cond ((= n 1) a)((even? n)(fast-expt(* a a) b (/ n 2)))(else(fast-expt(* a a b) b (/(- n 1) 2)))
)
)
(define(fast-expt b n)(expt-iter b n 1))(define(expt-iter b n a)(cond((= n 0)
a)((even? n)(expt-iter(square b)(/ n 2)
a))((odd? n)(expt-iter b
(- n 1)(* b a)))))
练习1.17:线型递归的加法:
(define(even? n)(=(remainder n 2) 0))(define(halve a)(/ a 2))(define(double a)(* a 2))(define(fast-multi a b)( cond ((= a 0) 0)((even? a)(double(fast-multi(halve a) b)))(else(+ b (fast-multi(- a 1) b)))
))
练习1.18,线性迭代的加法:
(define(f a b n)(
cond((= b 0) n)((even? b)(f(double a)(halve b) n))(else(f a (- b 1)(+ n a))))
)(define(fast-multi a b)(f a b 0))
基本思路和1.16如出一辙,用n来代表当前的结果.
练习1.19:
(define(fib a b p q count)(define(cmp_next_p p q)(+(* p p)(* q q)))(define(cmp_next_q p q)(+(* q q)(* 2 p q)))(cond((= count 0) b)((even? count)(fib a b (cmp_next_p p q)(cmp_next_q p q)(halve count)))(else(fib(+(* b q)(* a q)(* a p))(+(* b p)(* a q)) p q (- count 1)))
))( define (f n)(fib 1 0 0 1 n))