为了账号安全,请及时绑定邮箱和手机立即绑定

请问如下代码中ret这个的作用是什么?

请问如下代码中ret这个的作用是什么?

元芳怎么了 2022-09-15 15:11:11
float daPower(float x,int n){float ret=1,tmp;if(n==1)return x;tmp=daPower(x,n>>1);ret=tmp*tmp;if(n&1)ret*=x;return ret;}
查看完整描述

3 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

float daPower(float x,int n)

这个代码应该是计算x的n次幂,不过写的挺乱的
ret只是一个作为返回值的临时变量而已,只是单词“return”的缩写(我是说单词return,和return语句没关系)

float ret=1,tmp;
if(n==1)return x;//如果n为1,就代表是求某个数的1次幂,一个数的1次幂肯定是这个数本身,能理解吧
tmp=daPower(x,n>>1);//如果上条语句没返回就到这里,n>>1就是右移一位,一般可以理解为n/2
ret=tmp*tmp;//上面是把n/2,可是求的还是次幂,所以要把结果再乘一次,例如x的10次幂等于,x的5次幂乘以x的5次幂,理解了吗?
if(n&1)ret*=x;//这条语句的意思是,假设n是奇数,那么再乘一边x,意思就是假设n为5,那么n>>2就为2,两个x的2次幂相乘的结果是n的4次幂,我们要求5次幂,所以这里再乘一次
return ret;

总而言之⋯⋯很莫名其妙的算法

查看完整回答
反对 回复 2022-09-21
?
Helenr

TA贡献1780条经验 获得超4个赞

这是快速幂的求法~就是求实数x的n次方是多少
ret是一个返回值,最后返回的ret就是x的n次方
举个最简单的例子:
比如我们要求2的100次方,常规做法是将2自乘100次,对吧?但这个程序只要乘7次就可以啦~(运算级别降到了log2 100这么少!)
它的运行方法是:2^100=2^50×2^50,而2^50=2^25×2^25,以此类推,那么对于2^100来说,我们只要用tmp记录一个2^50,再返回tmp*tmp就可以了(也就是上述程序的ret=tmp*tmp的作用)
再解释一下tmp=daPower(x,n>>1)的意思,n>>1的意思就是n二进制中右移一位(什么那么复杂啦,就是除以2取整数嘛!)也就起到了算2^100只要算2^50次方(50由100>>1也就是除以2得到)的作用,至于最麻烦的if(n&1)ret*=x的话嘛~就是一种特殊情况:
首先if(n&1)是判断n是不是奇数,(是把n转成了二进制,判断最后一位是否是1,是1就表示是奇数,不信你试试奇数二进制下最后一位是不是1?)如果是奇数就看下面:
比如我们算2^101,101不是偶数,不能单纯地101>>1再自乘得到,而要算出2^50,然后再自乘一个2得到,也就是2^101=(2^50)×(2^50)*2,所以有了if(n&1)ret*=x;(相当于ret=ret*x;)这一句话了~最后就返回个ret
再介绍点好玩的东西,为什么返回值是ret不是ter或者别的什么呢?因为return这个单词前三个字母就是ret!为了方便记忆说等一下我要返回值,所以很多人都把返回值用ret作变量!谢谢~


查看完整回答
反对 回复 2022-09-21
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

float daPower(float x,int n)
{
float ret=1,tmp;
if(n==1)return x; //剩下1次方的时候,才是递归函数终止条件
tmp=daPower(x,n>>1);
ret=tmp*tmp;
if(n&1)ret*=x;
return ret;
}
这个函数是求 x^n,也就是x的n次方,ret就是所求的返回值,由于这个函数用了移位,和递归,理解这个算法上就需要一定的数学功底
随便举个例子
假设调用的是 float daPower(2.1, 31),也就是2.1的31次方
这个算法的过程就是
float daPower(2.1,31)
{
float ret=1,tmp;
if(n==1)return x; //因为 n=31,所以此分支没有进来
tmp=daPower(x,n>>1); //n>>1就是n/2,所以tmp的值就是 2.1的15次方,递归调用
ret=tmp*tmp; //ret= tmp*tmp bn就是2.1的 30次方
if(n&1)ret*=x; //因为n是31,所以此分支进入 ret*=x; 也就是2.1的31次
return ret;
}


查看完整回答
反对 回复 2022-09-21
  • 3 回答
  • 0 关注
  • 364 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号