算法之迭代法求幂运算值

该博客介绍了使用迭代法在Scheme语言中进行幂运算的实现方式。通过递归地将问题分解为偶数幂和奇数幂两种情况,最终达到计算b的n次方的目的。代码中定义了判断是否为偶数的函数以及迭代计算的核心函数fe_iter,当n为0时停止迭代,输出结果即为所需求解的幂值。

算法之迭代法求幂运算值

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} abn=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 abn=a(b)n,a=a,b=b2,n=n/2
当n是奇数时,有a∗bn=ab∗(b)n−1a*b^n = ab*(b)^{n-1}abn=ab(b)n1

即可表示为:
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 abn=a(b)n,a=ab,b=b,n=n1
可以看到上面两个过程最后的形式都是相同的,即可迭代计算。

因为从形式上来说:a′(b′)n′a'(b')^{n'}a(b)na∗bna*b^nabn没有什么区别。

所以可以得到以下代码:

(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'}abn=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=abn=bn

故最后输出的就是所需要求得b的n次方。

注:本内容收集整理于互联网,仅供学习交流之用!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值