递归的最大深度是多少?

What's the maximum depth of recursion?

本文关键字:多少 深度 递归      更新时间:2023-10-16

我想知道递归函数的最大深度是多少。我知道它与堆栈大小有关。但是这是什么关系呢?如果我在 32 位机器中编写一个函数,它只调用自己,最大深度是多少?

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

那么当堆栈溢出时,"时间"的价值是什么?

关系大致如下:

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

堆栈

帧是每次进行函数调用时推送到堆栈上的数据。它由函数返回地址、参数空间(未在寄存器中传递)和局部变量空间组成。对于不同的函数,它会有所不同,但对于在每次调用时递归调用自身的给定函数,它将是恒定的。

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

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

我在这里所说的一切可能有多个规则例外,但这是基本关系。