首页 > 代码库 > SICP-求幂

SICP-求幂

【问题】

对一个给定的数计算乘幂问题。

【思路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是偶数