退出c++中的递归堆栈

Exit from the recursion stack in C++

本文关键字:递归 堆栈 c++ 退出      更新时间:2023-10-16

在c++中有没有办法完全退出递归堆栈?例如,我正在使用递归搜索一些目标状态,当我找到时,只需打印它并从所有递归堆栈中出来。

做到这一点的最直接的方法(这在风格上是否最好是值得怀疑的)可能是通过将递归函数包装在try/catch块中,然后通过抛出包含计算结果的某种自定义异常退出。这将自动将堆栈展开到try/catch块的级别,然后您可以从那里继续。

异常将展开堆栈,但这通常是一个糟糕的选择。使用异常进行流控制可能是不明智的。维护可能会更加困难,特别是如果其他人必须更新代码并且不知道通过异常退出。最好的选择是从每个级别优雅地返回。

异常使得这非常简单,抛出和捕获异常可以让您一次跳出许多堆栈帧。

可以抛出异常,
但是对于尾部递归,就不会有"递归堆栈"

当然,您可以使用异常来展开堆栈并适当地运行局部变量的析构函数。

或者你可以使用旧的setjmp/longjmp,它不会运行析构函数。在IIRC中,如果缺少析构函数,将导致未定义的行为。