【问题标题】:Getting out of a recursive function at the topmost level in C++在 C++ 的最顶层摆脱递归函数
【发布时间】:2015-04-29 00:48:14
【问题描述】:

假设您已经深入了解递归函数的几个层次。该函数最初是在 main 中调用的。有没有办法让你摆脱递归并直接回到 main 而不必通过上面的所有其他函数?

【问题讨论】:

  • 递归函数应该正常地返回。将递归转换为循环是解决问题的一种方法。顺便说一句,你为什么要打破递归?过早的优化?
  • 我遇到了一些问题,如果我可以直接存在于 main 中,这些问题将很容易解决。但是,我已经跟踪了递归并解决了问题。

标签: c++ recursion g++


【解决方案1】:

您可以为此使用异常——要么抛出一些合适的异常,要么自己制作并使用它。虽然通常不建议使用异常进行流控制,但这是这里唯一可靠的方法。

【讨论】:

    【解决方案2】:

    在 C 中,您可以为此使用 longjmp/setjmp,但我认为在 C++ 中使用它并不安全(绕过析构函数?)。您可能必须使用异常。

    【讨论】:

    • longjmp/setjmp?对于 C++,非常糟糕的主意。我假装我没读过。
    • @sbi:确实,因此我的 caveat 在答案中。可能仍然存在您可能想要使用它的特定情况,并且这样做是安全的,例如不使用 ctors/dtors 的简单递归函数,但通常应该避免这种 hack。
    【解决方案3】:

    问题是你是如何到达那里的?什么样的算法让你深陷递归而无法摆脱它?

    任何递归函数都必须有一种方法来结束递归,它只有在条件为真或假时才会递归。当这不成立时,递归结束并且函数返回而不是更深地递归。
    为什么不以这种方式结束递归,返回所有级别?

    如果你绝望了,例外是要走的路,但这是(正确的,IMO)不赞成的做法。

    【讨论】:

    • 摆脱递归不是问题,使用正确的值才是问题。不知何故,我的价值观在回来的路上被破坏了。
    • @Phenom:而不是分析和理解问题并解决它,你只是试图躲避它?你怎么知道它没有潜伏在那里,即使它可能不会在你更改代码后立即发生?
    【解决方案4】:

    您也许可以从堆栈中获取位置并使用汇编程序来跳转到它,但是您为什么要这样做呢?

    您还必须考虑到,当您搬到新的牧场时,必须有人维护它。

    【讨论】:

      【解决方案5】:

      使您的函数可以优化尾调用。那么就不用担心“上面的函数”了。

      【讨论】:

        【解决方案6】:

        不,您不能中断递归并直接返回到您的 main()。如果您的递归函数在递归调用后不做其他工作,您将有效地完成同样的事情。我建议重组你的递归函数。说明为什么要尽早中断递归也会很有帮助。

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            猜你喜欢
            • 2016-02-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-19
            • 1970-01-01
            • 2018-06-15
            • 2020-06-25
            • 2010-11-07
            相关资源
            最近更新 更多