首页 > 代码库 > 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是偶数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。