递归函数的分段错误

时间:2011-11-20 15:13:18

标签: c++ g++

我只是想测试一下。我想知道我做错了什么?

   #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

4 个答案:

答案 0 :(得分:7)

递归没有退出。

你可能想要

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

答案 1 :(得分:2)

当你遇到基础案例时,你并没有结束递归。即使m == 0m == 1为真,您仍然会递归调用pwr。所以你有无限的递归。

答案 2 :(得分:2)

无限递归:无条件执行递归调用,因此调用堆栈会一直增长,直到错误停止。

这是堆栈溢出。

答案 3 :(得分:-1)

你除以0:假设m从1开始,在下一次迭代中m = 1/2 = 0,你就会得到错误。 如果m = 0而不是通过该方法,你可能想要做的就是返回1。