最大递归深度是多少?

时间:2015-01-12 11:00:46

标签: c++ recursion stack

我想知道递归函数的最大深度是多少。我知道它与堆栈大小有关系。但是这种关系是什么?如果我在32位机器中编写一个函数,除了自称之外什么都没有,最大深度是什么?

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

然后'时代'的价值是什么?当堆栈溢出?

1 个答案:

答案 0 :(得分:2)

这种关系大致

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

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

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

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

我在这里说过的所有内容可能都有多个例外,但这是基本关系。