【问题标题】:What's the maximum depth of recursion? [closed]递归的最大深度是多少? [关闭]
【发布时间】:2015-03-10 03:07:56
【问题描述】:

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

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

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

【问题讨论】:

  • 伙计,这取决于很多事情。它们太多了,任何人都无法明智地给出一个绝对的、始终正确的“最大深度是 XY”的答案。
  • 递归的最大深度不仅取决于堆栈大小,还取决于每个递归调用的参数的总编码大小。只是粗略地猜测,对于您的示例,至少必须存储返回地址(可能会以 4 个字节编码),因此最大深度将大致是堆栈大小除以四,具体取决于调用堆栈的大小递归的开始。
  • 在编译器可以执行尾递归优化的情况下,没有最大深度。
  • @Roger Kang:你的实验揭示了什么?
  • 如果您需要一个近似值,它是现代 PC 上的数十万次调用。但正如@Codor 所说,真正的价值很大程度上取决于参数和局部变量。

标签: c++ recursion stack


【解决方案1】:

这种关系大致是这样的:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-03-20
    • 2018-09-04
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多