C++ 在C+;中的最顶层退出递归函数+;

C++ 在C+;中的最顶层退出递归函数+;,c++,recursion,g++,C++,Recursion,G++,假设您深入到递归函数的几个层次。该函数最初是在main中调用的。是否有一种方法可以让您摆脱递归,直接返回main,而不必遍历上面的所有其他函数 您可能能够从堆栈中获取该位置,并使用assembler对其进行jmp,但为什么要这样做呢 你也必须考虑到,当你搬到牧场的时候,新的一个人将不得不维持它。 < P>你可以用例外来解决这个问题——要么抛出一些合适的例外,要么自己动手,然后使用它。虽然一般不建议使用流控制异常,但这里是唯一可靠的方法。 在C中,您可以使用 LojjMP < /C>>/Cudio

假设您深入到递归函数的几个层次。该函数最初是在main中调用的。是否有一种方法可以让您摆脱递归,直接返回main,而不必遍历上面的所有其他函数

您可能能够从堆栈中获取该位置,并使用assembler对其进行jmp,但为什么要这样做呢


你也必须考虑到,当你搬到牧场的时候,新的一个人将不得不维持它。

< P>你可以用例外来解决这个问题——要么抛出一些合适的例外,要么自己动手,然后使用它。虽然一般不建议使用流控制异常,但这里是唯一可靠的方法。

在C中,您可以使用<代码> LojjMP < /C>>/Cudio> SETJMP < /Cord>,但是我认为在C++中使用这个(旁路析构函数)是安全的。您可能必须使用异常。

问题是您是如何做到这一点的?什么样的算法能让你深入到递归中而没有办法摆脱它

任何递归函数都必须有结束递归的方法,只有当条件为真或假时,它才会递归。如果不成立,则递归结束,函数返回,而不是更深层次的递归。
为什么不这样结束递归,返回所有级别


如果你绝望了,破例是最好的办法,但这(在我看来是正确的)是不赞成的

使函数的尾部调用可优化。然后就没有“上面的函数”可担心了。

不,您不能中断递归直接返回main()。如果您的递归函数在递归调用之后不做其他工作,那么您将有效地完成同样的事情。我建议重新构造递归函数。描述一下为什么要尽早脱离递归也会很有帮助。

我在Nqueen的回溯算法中遇到了同样的问题


最简单的方法是添加一个全局布尔变量,并使用它来阻止父函数中的任何进一步操作

longjmp
/
setjmp
?非常糟糕的C++思想。我假装没读过。@sbi:的确,因此我在回答中提出了警告。在某些特定情况下,您可能仍希望使用它,并且这样做是安全的,例如,不使用CTOR/DTOR的简单递归函数,但通常应避免此类攻击。递归函数应正常返回。将递归转换为循环是解决问题的一种方法。顺便说一句,为什么你想打破递归?过早优化?我遇到了一些问题,如果我可以直接存在于main中,这些问题很容易解决。但是,我跟踪了递归并修复了问题。退出递归不是问题,使用正确的值退出才是问题。“不知怎的,我的价值观在回归的过程中被破坏了。@Phenom:你不是分析、理解问题并解决它,而是试图回避它?即使在您更改代码后可能不会立即发生,您如何知道它还没有潜伏在那里?