【发布时间】:2015-03-10 03:07:56
【问题描述】:
我想知道递归函数的最大深度是多少。我知道它与堆栈大小有关。但是有什么关系呢?如果我在 32 位机器上编写一个函数,它只调用自身,最大深度是多少?
unsigned long times=0;
void fun()
{
++times;
fun();
}
那么当栈溢出时,'times'的值是多少呢?
【问题讨论】:
-
伙计,这取决于很多事情。它们太多了,任何人都无法明智地给出一个绝对的、始终正确的“最大深度是 XY”的答案。
-
递归的最大深度不仅取决于堆栈大小,还取决于每个递归调用的参数的总编码大小。只是粗略地猜测,对于您的示例,至少必须存储返回地址(可能会以 4 个字节编码),因此最大深度将大致是堆栈大小除以四,具体取决于调用堆栈的大小递归的开始。
-
在编译器可以执行尾递归优化的情况下,没有最大深度。
-
@Roger Kang:你的实验揭示了什么?
-
如果您需要一个近似值,它是现代 PC 上的数十万次调用。但正如@Codor 所说,真正的价值很大程度上取决于参数和局部变量。