分段故障上的递归函数

segmentation fault on a recursive function

本文关键字:递归函数 故障 分段      更新时间:2023-10-16

我只是想测试一些东西。我在想我做错了什么?

   #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

递归没有出口。

你可能需要

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

无限递归:无条件地执行递归调用,因此调用堆栈不断增长,直到出现错误停止它。

当您达到基本情况时,您并没有结束递归。即使m == 0m == 1为真,你仍然递归地调用pwr。这就是无限递归

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