【问题】
对一个给定的数计算乘幂问题。
【思路1】
对一个基数b和一个正整数的指数n,计算出b^n的过程。可以通过下面的这个递归定义:
b^n = b * b ^(n-1)
b^0 = 1
直接翻译为如下过程:
(define (expt b n) (if (= n 0) 1 (* b (expt b (- n 1)))))
这是一个线性的递归计算过程,需要THETA(n)步和THETA(n)空间。我们可以很容易将其形式化为一个等价的线性迭代:
(define (expt b n) (expt-iter b n 1)) (define (expt-iter b counter product) (if (= counter 0) product (expt-iter b (- counter 1) (* product b))))
这个版本需要THETA(n)步和THETA(1)空间。
【思路2】
采用如下规则完成乘幂计算:
b^n = (b^(n/2))^2 若n是偶数
b^n = b * b^(n-1) 若n是奇数
这一方法可以定义为如下的过程:
(define (fast-expt b n) (cond ( (= n 0) 1) ( (even? n) (square (fast-expt b (/ n 2)))) (else (* b (fast-expt (b (- n 1))))))) (define (even? n) (= (remainder n 2) 0))
这一计算过程只需要THETA(log n)步。
迭代方式的求幂计算过程:
(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)))))
采用不同的方式实现时,我们考虑规则的角度会很不一样。
递归方式: b^n = (b^(n/2))^2 若n是偶数
迭代方式:b^n = (b^2)^(n/2) 若n是偶数
SICP-求幂
时间: 2024-10-15 08:06:41