为什么这个递归函数会崩溃?

时间:2014-10-07 02:36:14

标签: c++ crash segmentation-fault

    int g(int n) {
        int x = g(n - 1);
        if (x > 0) {
            return x + 1;
        } else {
            return 1;
        }
    }

我的猜测是它与函数的第一行有关......但我不确定为什么会这样。

3 个答案:

答案 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),依此类推。

递归调用通常在函数结束时调用,或者至少在评估之后调用,以确保递归不是无限的(例如在示例代码中)。