MST

星途 面试题库

面试题:C++ 中递归函数栈溢出风险的场景分析

请描述一个在 C++ 中可能导致递归函数栈溢出的常见场景,并说明为什么会出现栈溢出。同时,请提供一种简单的方法来避免该场景下的栈溢出。
48.8万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

常见场景

在C++ 中,当递归函数没有正确的终止条件或者终止条件很难达到时,容易导致栈溢出。例如:

void recursiveFunction() {
    recursiveFunction();
}

上述代码中,recursiveFunction函数一直在调用自身,没有任何终止条件。

栈溢出原因

每次函数调用都会在栈上分配空间,用于存储函数的局部变量、参数等信息。当递归调用无限制地进行下去时,栈上分配的空间会不断增加,直到耗尽系统为栈分配的内存空间,从而导致栈溢出错误。

避免方法

可以使用迭代(循环)来代替递归。以计算阶乘为例,递归实现如下:

int factorialRecursive(int n) {
    if (n == 0 || n == 1) {
        return 1;
    } else {
        return n * factorialRecursive(n - 1);
    }
}

使用迭代实现:

int factorialIterative(int n) {
    int result = 1;
    for (int i = 1; i <= n; ++i) {
        result *= i;
    }
    return result;
}

通过迭代的方式,避免了递归调用带来的栈空间不断消耗的问题。