练习1.16
; (define (odd? n) (= (remainder n 2) 1))
; Most interpreters have a built-in procedure odd?
(define (sqaure x) (* x x))
(define (fast-expt-iter base index result)
(cond ((= index 0) result)
((odd? index) (fast-expt-iter base (- index 1) (* result base)))
(else (fast-expt-iter (sqaure base) (/ index 2) result))))
(define (fast-expt base index)
(fast-expt-iter base index 1))
如果指数为偶数 就把底数平方 把指数减半
如果指数为奇数 就外乘一个底数(外乘的底数放在result中) 把指数减一
这样 就可以保证 不变
以下是fast-expt计算 的过程
(fast-expt 2 10)
(fast-expt-iter 2 10 1)
(fast-expt-iter 4 5 1)
(fast-expt-iter 4 4 4)
(fast-expt-iter 16 2 4)
(fast-expt-iter 256 1 4)
(fast-expt-iter 256 0 1024)
1024