我只是想测试一下。我想知道我做错了什么?
#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 :(得分: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 == 0
或m == 1
为真,您仍然会递归调用pwr
。所以你有无限的递归。
答案 2 :(得分:2)
无限递归:无条件执行递归调用,因此调用堆栈会一直增长,直到错误停止。
这是堆栈溢出。
答案 3 :(得分:-1)
你除以0:假设m从1开始,在下一次迭代中m = 1/2 = 0,你就会得到错误。 如果m = 0而不是通过该方法,你可能想要做的就是返回1。