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

Why does this recursive function crash?

本文关键字:崩溃 递归函数 为什么      更新时间:2023-10-16
    int g(int n) {
        int x = g(n - 1);
        if (x > 0) {
            return x + 1;
        } else {
            return 1;
        }
    }

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

如果函数只是这样说:

int g(int n) {
    return g(n - 1);
}

那么你显然不会期望它工作,而是继续递归,直到你用完堆栈空间和程序崩溃。通过将递归放在函数中的退出条件之前,您基本上就是这样做的。

应重写该函数,以便它在再次调用g()之前执行退出测试。

如果您通过调试器(如 gdb (运行它,您应该看到它实际上永远不会退出。

Program received signal SIGSEGV, Segmentation fault.
0x00000000004004de in g (n=-240246) at test.c:10

就我而言,test.c:10是你的int x = g(n - 1);线路,它只是一遍又一遍地被调用。

因为函数的第一行调用完全相同的函数,所以"return"永远不会被执行。因此,这是一个无限循环,直到它"崩溃"。

如果我们要评估它: g(20):呼叫g(19):呼叫g(18)等。

递归调用

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