2011-11-21 70 views
-1

我在这个函数中做了什么错误。我很确定问题在于base = exp(base, pwr /= 2) * exp(base, pwr /= 2);,但我想不出合乎逻辑的原因。有没有一种可能的方式来编写这样的参数?提前致谢。 (我的这个功能的输出是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

你有没有尝试在调试器中通过这个步骤? –

+0

应该做什么功能以及预期输出是什么? –

+4

由于您在各处都使用引用,因此对“base”或“pwr”所做的每个操作都将影响当前对该函数的所有调用。删除代码中的所有引用,然后重试;如果它仍然无法工作,至少它将比调试更容易100倍。 – tenfour

回答

2

这里有五件事情需要注意有关该行:

base = exp(base, pwr /= 2) * exp(base, pwr /= 2); 
  1. 如上评论指出,base被引用,而不是值传递的,所以只有它的一个副本,你改变它的价值。这是一个坏主意。
  2. pwr也是按引用传递的,当你使用/=,而不只是/你改变它的价值。此行中有两条/=语句,因此在此行运行后,pwr现在具有其原始值的四分之一。
  3. 每次运行此行时,exp函数都会运行两次。存储该值并将其平方值更有意义。
  4. /2是整数除法,所以它会向下取整。所以,如果你给它一个数字,如3为指数,将无法正常工作,因为3/2是1。如果你纠正对方失误,并与7指数的调用它,它最终会只是做exp(2,7) = exp(2,3)*exp(2,3) = exp(2,1)*exp(2,1)*exp(2,1)*exp(2,1) = 16时明显正确的答案是128这个功能,如设计,才能正确当指数是2
  5. 好东西的幂,4号是真实的工作,因为如果你没有得到EXP(2,1.5)你永远不会终止,因为它不符合你的基本情况。一般来说,你应该重新考虑你的算法。
+0

啊,谢谢解释。 – ihm

+0

6。在同一行内分配两次变量。你的'/ ='pwr加两次,这可能会起作用,或者导致大量的错误。 – zennehoy

+0

这实际上是2点的一部分。我注意到这是它的原始价值的四分之一。不过,我会编辑它以使其更加清晰。 –

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

我不知道这会帮助(它肯定会慢一些),但也许值得尝试?我也会删除很多参考文献。

+0

对不起,我在这里没有C-Plus-Plus程序/编译器,愚蠢的macbook(只是开玩笑,我喜欢它们) – victoroux

+0

是的,我知道问题出在那里,但我不明白为什么它是错误的,我可以写出来e代码像'else {pwr/= 2; base = exp(base,pwr)* exp(base,pwr);}'并且得到正确答案。但我想弄清楚这个表达方式有什么问题。 – ihm

+0

然后使用各种数学计算它自己。你会很容易找到,哈哈。旧的纸和笔没有把戏...... – victoroux

1

既然你声称这是不是功课:

  1. 正如其他人所提到的,引用不属于这里。每次递归调用都需要计算中特定点的值。

  2. exp(base, pwr /= 2) * exp(base, pwr /= 2);

    当你的指数是不是2的倍数在修复参考的东西,如果你还是真的想去做这样按预期这样可不行,请尝试:

    exp(base, pwr/2) * exp(base, (pwr/2 + pwr%2));

+0

我还在想。我明白,它不工作,如果它不是2的倍数。 – ihm

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)是不是真的正确..

+0

也作为百事可乐说,这不会与指数不是2的权力... –

1

我们可以通过这一步很容易,第一通过exp基础的时间是2,pwr是4,所以我们用exp(2,1)* exp(2,0)调用(记得你设置pwr = pwr/2)。因此,第一个计算结果为2,第二个计算结果为1,因此您返回的结果是2 * 1,这是2.我认为您的代码意味着返回exp(2,1)* exp(2, 1)。