【问题】
对一个给定的数计算乘幂问题。
【思路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是偶数