【问题标题】:is int foo() { return foo(); } a recursive function?是 int foo() { return foo();递归函数?
【发布时间】:2015-02-26 17:39:49
【问题描述】:

意志:

int foo();

int foo()
{
    return foo();
}

永久循环,否则它将只运行该函数两次(一次隐式运行,一次终止一次)。

【问题讨论】:

  • @Rizier123 我不会问我是否尝试过。
  • @AlanSalios 程序停止了吗?
  • 无论如何我都无法解释发生的事情。
  • @AlanSalios 运行它并在foo() 上放置一个断点,然后通过它进行调试。
  • 好吧,“我不会问我是否尝试过”被否决,我并不感到惊讶。如果问题是“尽管我预期 X,但我尝试并得到了分段错误”,那么可能会有不同的看法(尽管这仍然不是一个好问题)。另一方面,我不确定这可能是 UB(在这种情况下尝试可能没用):IIRC,最新的 C++ 标准说“编译器可能假设一个没有副作用的线程终止”并且采用了 C11用于标准化线程的 C++ 内存模型,也许它们在这里是相似的......无论哪种方式,该函数都是无用的:)

标签: c function recursion


【解决方案1】:

是的,foo() 是一个导致无限循环的递归函数。

如果你的编译器优化了尾递归,那么它可能会一直运行,直到你杀死它。如果您的编译器没有优化尾递归,那么您最终会溢出堆栈和/或内存不足。

【讨论】:

  • 这听起来既卑鄙又危险。
  • @AlanSalios:您编写递归函数的方式既卑鄙又危险。通常,递归函数将具有退出条件(即 - 不要再次递归调用自身),该条件由其输入以某种方式参数化,因此不会发生无限递归。许多树操作代码最好以递归方式编写。典型的退出条件可能类似于 if (node->child != NULL) recurse(node->child);然后在构建树时确保终端节点的子节点为 NULL。
【解决方案2】:

是的,它是一个没有任何基本情况的递归函数。因此它永远不会正常终止。

【讨论】:

    猜你喜欢
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 2011-07-26
    • 1970-01-01
    • 2012-09-17
    相关资源
    最近更新 更多