查找最大递归深度
Find maximum recursion depth
有没有办法在 c++ 中知道最大递归深度,而无需显式调用递归直到它崩溃?
我已经看到这受到堆栈大小的限制。也许在特定递归级别查找堆栈中的可用空间量会很有用。可能吗?
我现在唯一能想到的就是使用 getrlimit
来获取专用于您的进程的堆栈的最大大小。接下来要做的是找到一种获取当前使用的堆栈大小的方法。我认为getrusage
是要走的路,但是在查看了man
页面和SO上的几篇帖子后,它似乎不再支持此特定功能。所以你必须找到另一种方式。我相信Valgrind
也会报告堆栈使用情况,因此查看其源代码和文档可能会很有用。
一旦你能够得到当前的堆栈大小,你就可以测量
-
它在开始递归之前的初始状态(这样您就可以从计算中排除它,因为它与递归本身没有任何关系)
-
单次迭代的更改
排除初始堆栈分配以及使用总堆栈大小和单个递归步骤所需的分配,您应该能够近似给定系统可以拥有的递归次数。我不确定它是否有效,而且即使准确,此类测量也高度取决于您使用的系统(毕竟堆栈与进程可以拥有的虚拟内存量密切相关)。
最大递归深度取决于函数使用的内存量、平台上的内存量以及操作系统或编译器的限制(如果有)。
在递归调用中,内存被以下人员占用:
- 函数调用的开销
- 传递的参数占用的内存。
- 局部变量占用的内存
将比传递大量大型对象并占用大量局部变量的函数具有更高的可能深度(递归调用次数)。
因此,问题的答案是:递归调用的最大数量取决于递归调用占用的内存量、系统上的内存量以及编译器或操作系统施加的任何限制。 不同的递归函数占用不同的内存量。
如果您知道所有这些项目,则可以计算可能的最大递归数。
相关文章:
- 通过递归进行因子分解
- 递归函数计算序列中的平方和(并输出过程)
- 使用递归的数组的最小值.这是怎么回事
- 使用后序遍历递归的深度优先搜索会产生意外输出
- 由于深度递归而导致堆栈溢出
- 5000+ 深度递归时函数堆栈溢出
- OpenMP:即使在深度极限的情况下,递归任务也比顺序慢
- 可变参数模板实例化中的无限递归,试图构建任意深度的树状结构
- lambda 的深度递归
- C++递归函数,调用当前深度
- 递归的最大深度是多少?
- 查找最大递归深度
- 如何跳出一些深度递归的函数并直接返回结果
- 如何跟踪递归深度
- 如何改进此模式所需的模板递归深度
- 递归深度切断策略:并行快速排序
- 具有合成和继承属性的深度递归qi语法(解析器)
- 为什么这超过了递归模板的最大深度
- 递归模板实例化超出了最大深度 256
- 深度优先搜索或回溯递归查找字谜/拼字板中所有可能的字母组合