我想知道递归函数的最大深度是多少。我知道它与堆栈大小有关系。但是这种关系是什么?如果我在32位机器中编写一个函数,除了自称之外什么都没有,最大深度是什么?
unsigned long times=0;
void fun()
{
++times;
fun();
}
然后'时代'的价值是什么?当堆栈溢出?
答案 0 :(得分:2)
这种关系大致:
最大递归深度=((堆栈大小) - (调用链中堆栈帧的总大小,直到递归函数))/(递归函数的堆栈帧大小)
堆栈帧是每次进行函数调用时被压入堆栈的数据。它由函数返回地址,参数空间(未在寄存器中传递)和局部变量空间组成。它对于不同的函数会有所不同,但对于给定函数在每次调用时递归调用自身都是常量。
由此得出,具有大量参数和/或大量局部变量的递归函数将具有更大的堆栈帧大小,因此对于给定大小的堆栈具有更小的最大递归深度。
如果编译器执行尾递归优化,那么在顶级调用之后堆栈帧大小实际上为零,因此公式给出除以零:没有最大递归深度。
我在这里说过的所有内容可能都有多个例外,但这是基本关系。