int g(int n) {
int x = g(n - 1);
if (x > 0) {
return x + 1;
} else {
return 1;
}
}
我的猜测是它与函数的第一行有关......但我不确定为什么会这样。
答案 0 :(得分:3)
如果该功能只是这样说:
int g(int n) {
return g(n - 1);
}
然后你显然不希望它工作,而是继续递归,直到你的堆栈空间用完,程序崩溃。通过在函数中将退出条件放在递归条件之前,您基本上就是这样做了。
您应该重写该函数,以便在再次调用g()
之前执行退出测试。
答案 1 :(得分:1)
如果您通过gdb
之类的调试器运行它,您应该会看到它实际上从未退出。
Program received signal SIGSEGV, Segmentation fault.
0x00000000004004de in g (n=-240246) at test.c:10
在我的情况下, test.c:10
就是你的int x = g(n - 1);
行,只是一遍又一遍地被调用。
答案 2 :(得分:1)
因为函数的第一行调用完全相同的函数,所以'return'永远不会被执行。因此它是一个无限循环,直到它“崩溃”。
如果我们要评估它:
g(20)
:致电g(19)
:致电g(18)
,依此类推。
递归调用通常在函数结束时调用,或者至少在评估之后调用,以确保递归不是无限的(例如在示例代码中)。