我在这个功能中做错了什么。我很确定问题出在base = exp(base, pwr /= 2) * exp(base, pwr /= 2);
,但我无法想到合乎逻辑的原因。有没有办法写出这样的参数?提前致谢。 (p.s我的这个函数的输出是2
这是错误的)
#include <iostream>
using namespace std;
unsigned long& exp(unsigned long& base, unsigned long& pwr)
{
if(pwr == 0)
base = 1;
else if(pwr == 1)
base = base;
else
base = exp(base, pwr /= 2) * exp(base, pwr /= 2);
return base;
}
int main()
{
unsigned long n=2, m = 4;
cout << exp(n,m) << endl;
return 0;
}
答案 0 :(得分:3)
我可以看到的第一个问题是您通过引用传递了base
和pwr
。
执行此操作时,每次调用exp
时都会修改其全局值,因此您应根据所编写的代码预期得到的输出。
为了得到正确的结果,我会替换
exp(base, pwr /= 2) * exp(base, pwr /= 2);
与
exp(base, pwr/2) * exp(base, pwr/2);
因为你的exp(2, 4) = exp(2, 2) * exp(2, 1)
不正确..
答案 1 :(得分:2)
关于这一行,有五点需要注意:
base = exp(base, pwr /= 2) * exp(base, pwr /= 2);
base
是通过引用传递的,而不是值,因此只有一个副本,并且您正在更改其值。这是一个坏主意。pwr
也会通过引用传递,当您使用/=
而不仅仅是/
时,它会更改其值。此行中有两个/=
语句,因此在此行运行后,pwr
现在有四分之一的原始值。/2
是整数除法,因此它将向下舍入。因此,如果你给它一个像3作为指数的数字,它将无法正常工作,因为3/2是1.如果你纠正其他错误并用指数7调用它,它最终只会做{{1当显然正确的答案是128时。这个函数,如设计的那样,只有当指数是2的幂时才能正常工作。答案 2 :(得分:1)
既然你声称这不是作业:
正如其他人所说,参考文献不属于此处。每次递归调用都需要计算中该特定点的值。
exp(base, pwr /= 2) * exp(base, pwr /= 2);
当指数不是2的倍数时,这将无法正常工作。修复引用后,如果您仍然真的想这样做,请尝试:
exp(base, pwr/2) * exp(base, (pwr/2 + pwr%2));
答案 3 :(得分:1)
我们可以相当容易地逐步完成这个,第一次通过exp base是2而pwr是4所以我们用exp(2,1)* exp(2,0)调用(记住你正在设置pwr = pwr / 2 )。所以第一个评估为2,第二个评估为1,所以你返回2 * 1的结果,即2.我认为你的代码意味着返回exp(2,1)的结果* exp(2, 1)相反。
答案 4 :(得分:0)
这很奇怪。对我来说,你的代码在逻辑上和语法上都是正确的。我会同意你的问题所在。没有我自己调试,我建议你尝试一下程序的简单数字(n = 1,m = 1; n = 4,m = 1; n = 2,m = 1; n = 2,m = 0 )。如果这一切都很好,那么问题似乎就在于你所指出的问题。
我知道这并不能解决你的问题,但这是一个开始(如果你还没有完成)。我愿意,因为我疯了,也试试
else {
power = power-1;
base = base * exp(base, power);
}
我不确定这是否有帮助(它肯定会慢一点),但也许值得一试?我也会删除很多参考文献。