2011-11-20 98 views
1

我只是想测试一些东西。我想知道我做错了什么?递归函数的分段错误

#include <iostream> 
    using namespace std; 
    unsigned long pwr(unsigned long n, unsigned long m) 
    { 
      if(m == 0) 
      n = 1; 
      if(m == 1) 
      n = n; 
      n = pwr(n, m/2) * pwr(n, m/2); 
      return n; 
    } 

    int main() 
    { 
      unsigned long n(2), m(16); 
      cout << pwr(n, m); 
      return 0; 
    } 

输出

Segmentation fault 
+0

您是否尝试过使用printf调试来查看它失败的线路以及它被递归的程度? –

回答

6

递归没有退出。

你可能想

  if(m == 0) 
      n = 1; 
      else if(m == 1) 
      n = n; 
      else 
      n = pwr(n, m/2) * pwr(n, m/2); 
      return n; 
+0

工作。非常感谢 – ihm

-1

您除以0:让我们说米1开始,在接下来的迭代M = 1/2 = 0,你会得到错误。 你可能想要做的事情返回1如果m = 0而不是通过方法。

+0

but'if(m == 1)n = n' right?我有这个基地。 – ihm

+1

'm'永远不会用作除数,只有'2'是。 –

+0

自从您继续运行该方法以来,它不是基础。你需要返回一些东西来停止递归。 – OSH

2

你不是结束递归时,你打你的基本情况。即使m == 0m == 1属实,您仍然递归调用pwr。所以你有无限递归。

2

无限递归:递归调用是无条件执行的,所以调用堆栈会一直增长,直到错误停止为止。

这是一个堆栈溢出。