查找最大递归深度

Find maximum recursion depth

本文关键字:深度 递归 查找      更新时间:2023-10-16

有没有办法在 c++ 中知道最大递归深度,而无需显式调用递归直到它崩溃?

我已经看到这受到堆栈大小的限制。也许在特定递归级别查找堆栈中的可用空间量会很有用。可能吗?

我现在唯一能想到的就是使用 getrlimit 来获取专用于您的进程的堆栈的最大大小。接下来要做的是找到一种获取当前使用的堆栈大小的方法。我认为getrusage是要走的路,但是在查看了man页面和SO上的几篇帖子后,它似乎不再支持此特定功能。所以你必须找到另一种方式。我相信Valgrind也会报告堆栈使用情况,因此查看其源代码和文档可能会很有用。

一旦你能够得到当前的堆栈大小,你就可以测量

  • 它在开始递归之前的初始状态(这样您就可以从计算中排除它,因为它与递归本身没有任何关系)

  • 单次迭代的更改

排除初始堆栈分配以及使用总堆栈大小和单个递归步骤所需的分配,您应该能够近似给定系统可以拥有的递归次数。我不确定它是否有效,而且即使准确,此类测量也高度取决于您使用的系统(毕竟堆栈与进程可以拥有的虚拟内存量密切相关)。

最大递归深度取决于函数使用的内存量、平台上的内存量以及操作系统或编译器的限制(如果有)。

在递归调用中,内存被以下人员占用:

  • 函数调用的开销
  • 传递的参数占用的内存。
  • 局部变量占用的内存
没有参数和局部变量的递归函数

将比传递大量大型对象并占用大量局部变量的函数具有更高的可能深度(递归调用次数)。

因此,问题的答案是:递归调用的最大数量取决于递归调用占用的内存量、系统上的内存量以及编译器或操作系统施加的任何限制。 不同的递归函数占用不同的内存量。

如果您知道所有这些项目,则可以计算可能的最大递归数。