练习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))

bn={(b2)n2,n is evenbbn1,n is odd b^n=\left\{ \begin{array}{ll} (b^2)^{n\over{2}},&\text{n is even}\\ b\cdot b^{n-1},&\text{n is odd} \end{array} \right.

如果指数为偶数 就把底数平方 把指数减半

如果指数为奇数 就外乘一个底数(外乘的底数放在result中) 把指数减一

这样 就可以保证 resultbaseindexresult \cdot base^{index} 不变

以下是fast-expt计算 2102^{10} 的过程

(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

results matching ""

    No results matching ""