c++ - 递归的最大深度是多少?

标签 c++ recursion stack

<分区>

我想知道递归函数的最大深度是多少。我知道它与堆栈大小有关。但是有什么关系呢?如果我在 32 位机器上编写一个函数,除了调用自身之外什么都不做,最大深度是多少?

unsigned long times=0;
void fun()
{
     ++times;
     fun();
}

那么栈溢出时'times'的值是多少?

最佳答案

这种关系大致是这样的:

最大递归深度 = ((堆栈大小) - (调用链中直到递归函数的堆栈帧的总大小))/(递归函数的堆栈帧大小)

堆栈帧是每次调用函数时被压入堆栈的数据。它由函数返回地址、参数空间(未通过寄存器传递)和局部变量空间组成。对于不同的函数,它会有所不同,但对于在每次调用时递归调用自身的给定函数,它是不变的。

由此得出,具有大量参数和/或大量局部变量的递归函数将具有更大的堆栈帧大小,因此对于给定大小的堆栈,最大递归深度更小。

如果编译器执行尾递归优化,那么在顶层调用之后堆栈帧大小实际上为零,因此公式给出除以零:没有最大递归深度。

我在这里所说的一切可能都有多个异常(exception)情况,但这是基本关系。

关于c++ - 递归的最大深度是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27900484/

相关文章:

c++ - 快速了解 C++ 数组类构造函数

c# - 如何将结构从 C# 传递到 C++ DLL?

c++ - 如何在 C++ 中通过引用传递堆栈矩阵

javascript - 递归逻辑在 Javascript 中不起作用

java - 如何在一个递归函数中先向上再向下计数?

c++ - const 数组是否在存储在堆栈中的函数中声明?

c++ - QTableView:从模型中删除行 -> 空行和 "QSortFilterProxyModel: index from wrong model passed to mapFromSource"

python - 如何改进这种自适应梯形法则?

c++ - 使用 C++ 在一个数组中实现 3 个堆栈

c - 为什么通过访问指针使程序崩溃?在 C 中