找到最大递归深度
Posted
技术标签:
【中文标题】找到最大递归深度【英文标题】:Find maximum recursion depth 【发布时间】:2016-06-14 04:39:42 【问题描述】:有没有办法在 c++ 中知道最大递归深度而无需显式调用递归直到它崩溃?
我发现这受到堆栈大小的限制。也许在特定的递归级别找到堆栈中的可用空间量会很有用。有可能吗?
【问题讨论】:
C++
中没有定义最大深度的内容。最大深度取决于 CPU 架构、特定于编译器的实现细节以及被递归的实际函数(连同它调用的子函数)。就像任何其他问题一样,当然,如果您知道所有参数,就可以确定解决方案....但在这种情况下,只进行显式调用并查看您得到的结果可能要容易得多。
虽然[temp.inst]
中有一段说有一个实现定义的数量。
那么如果有办法检查空闲堆栈大小以便在递归低于指定限制时停止递归?
任何答案都将是特定于平台和编译器的,因此您应该在问题中指定这些。
@Jepessen:无论您遇到什么问题,这都是错误的解决方案。
【参考方案1】:
我现在唯一能想到的就是使用getrlimit
来获得专用于您的进程的堆栈的最大大小。接下来要做的是找到一种获取当前使用的堆栈大小的方法。我认为getrusage
是要走的路,但在查看man
-page 和SO 上的几篇帖子之后,它似乎不再支持这个特定功能。所以你必须找到另一种方式。我确实相信Valgrind
也会报告堆栈使用情况,因此查看其源代码和文档可能会很有用。
一旦您能够获得可以测量的当前堆栈大小
开始递归之前的初始状态(这样您就可以从计算中排除它,因为它与递归本身没有任何关系)
单次迭代的变化
不包括初始堆栈分配以及使用总堆栈大小和单个递归步骤所需的分配,您应该能够估计给定系统可以拥有的递归数量。我不确定它是否会起作用,而且即使准确的测量也高度依赖于您使用的系统(毕竟堆栈与进程可以拥有的虚拟内存量密切相关) .
【讨论】:
【参考方案2】:最大递归深度取决于函数使用的内存量、平台上的内存量以及操作系统或编译器的限制(如果有)。
在递归调用中,内存被占用:
函数调用的开销 传递的参数占用的内存。 局部变量占用的内存没有参数和局部变量的递归函数将比传递大量大对象并占用大量局部变量的函数具有更高的可能深度(递归调用次数)。
因此,您的问题的答案是:递归调用的最大数量取决于递归调用占用的内存量、系统上的内存量以及编译器或操作系统施加的任何限制。不同的递归函数占用不同的内存量。
如果您知道所有这些项目,那么您可以计算可能的最大递归数。
【讨论】:
以上是关于找到最大递归深度的主要内容,如果未能解决你的问题,请参考以下文章