无法获得递归函数的正确输出

时间:2011-11-21 16:08:01

标签: c++ g++

我在这个功能中做错了什么。我很确定问题出在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;
}    

5 个答案:

答案 0 :(得分:3)

我可以看到的第一个问题是您通过引用传递了basepwr。 执行此操作时,每次调用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);
  1. 如上面的评论中所述,base是通过引用传递的,而不是值,因此只有一个副本,并且您正在更改其值。这是一个坏主意。
  2. pwr也会通过引用传递,当您使用/=而不仅仅是/时,它会更改其值。此行中有两个/=语句,因此在此行运行后,pwr现在有四分之一的原始值。
  3. 每次运行此行时,exp函数将运行两次。存储值然后将其平方化会更有意义。
  4. /2是整数除法,因此它将向下舍入。因此,如果你给它一个像3作为指数的数字,它将无法正常工作,因为3/2是1.如果你纠正其他错误并用指数7调用它,它最终只会做{{1当显然正确的答案是128时。这个函数,如设计的那样,只有当指数是2的幂时才能正常工作。
  5. 数字4的确是正确的,因为如果你得到exp(2,1.5),你就永远不会终止,因为它与你的基本情况不符。您可能应该重新考虑您的算法。

答案 2 :(得分:1)

既然你声称这不是作业:

  1. 正如其他人所说,参考文献不属于此处。每次递归调用都需要计算中该特定点的值。

  2. 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);
}

我不确定这是否有帮助(它肯定会慢一点),但也许值得一试?我也会删除很多参考文献。