算法之迭代法求幂运算值
author:onceday date:2022年6月8日
1.基于scheme语言
当n是偶数时,有bn=(b2)n/2b^n=(b^2)^{n/2}bn=(b2)n/2。
令其表示成(a=1):
a∗bn=a(b2)n/2
a*b^n=a(b^2)^{n/2}
a∗bn=a(b2)n/2
再令:
a∗bn=a′(b′)n′,a′=a,b′=b2,n′=n/2
a*b^n=a'(b')^{n'},a'=a,b'=b^2,n'=n/2
a∗bn=a′(b′)n′,a′=a,b′=b2,n′=n/2
当n是奇数时,有a∗bn=ab∗(b)n−1a*b^n = ab*(b)^{n-1}a∗bn=ab∗(b)n−1
即可表示为:
a∗bn=a′(b′)n′,a′=a∗b,b′=b,n′=n−1
a*b^n=a'(b')^{n'},a'=a*b,b'=b,n'=n-1
a∗bn=a′(b′)n′,a′=a∗b,b′=b,n′=n−1
可以看到上面两个过程最后的形式都是相同的,即可迭代计算。
因为从形式上来说:a′(b′)n′a'(b')^{n'}a′(b′)n′和a∗bna*b^na∗bn没有什么区别。
所以可以得到以下代码:
(define (fe b n)
(define (even? n)
(= (remainder n 2) 0)
)
(define (fe_iter a b n)
(cond ((= n 0) a)
((even? n) (fe_iter a (square b) (/ n 2)))
(else (fe_iter (* a b) b (- n 1)))
)
)
(fe_iter 1 b n)
)
其停止状态为n=0,由于一直有a∗bn=a′(b′)n′a*b^n=a'(b')^{n'}a∗bn=a′(b′)n′。
因此当n′=0n'=0n′=0时,b′=b[log2n]b'=b^{[log_2n]}b′=b[log2n],则a′=a∗bn=bna'=a*b^n=b^na′=a∗bn=bn。
故最后输出的就是所需要求得b的n次方。