<分区>
我想知道递归函数的最大深度是多少。我知道它与堆栈大小有关。但是有什么关系呢?如果我在 32 位机器上编写一个函数,除了调用自身之外什么都不做,最大深度是多少?
unsigned long times=0;
void fun()
{
++times;
fun();
}
那么栈溢出时'times'的值是多少?
<分区>
我想知道递归函数的最大深度是多少。我知道它与堆栈大小有关。但是有什么关系呢?如果我在 32 位机器上编写一个函数,除了调用自身之外什么都不做,最大深度是多少?
unsigned long times=0;
void fun()
{
++times;
fun();
}
那么栈溢出时'times'的值是多少?
最佳答案
这种关系大致是这样的:
最大递归深度 = ((堆栈大小) - (调用链中直到递归函数的堆栈帧的总大小))/(递归函数的堆栈帧大小)
堆栈帧是每次调用函数时被压入堆栈的数据。它由函数返回地址、参数空间(未通过寄存器传递)和局部变量空间组成。对于不同的函数,它会有所不同,但对于在每次调用时递归调用自身的给定函数,它是不变的。
由此得出,具有大量参数和/或大量局部变量的递归函数将具有更大的堆栈帧大小,因此对于给定大小的堆栈,最大递归深度更小。
如果编译器执行尾递归优化,那么在顶层调用之后堆栈帧大小实际上为零,因此公式给出除以零:没有最大递归深度。
我在这里所说的一切可能都有多个异常(exception)情况,但这是基本关系。
关于c++ - 递归的最大深度是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27900484/