Recursion 递归可以有一个无止境的循环吗?

Recursion 递归可以有一个无止境的循环吗?,recursion,iteration,infinite-loop,infinite-recursion,Recursion,Iteration,Infinite Loop,Infinite Recursion,我听到很多人说递归可以是一个“无止境的循环”,但这句话是否只适用于循环。对于这样的递归,说“无止境循环”是否有效和正确?说“无止境递归”不是更好吗?尾部递归可以被视为一个迭代循环。这是唯一一种不会以堆栈溢出错误迅速结束的无限递归类型 如果您在兼容的ECMAScript 2016实现中编写此代码 const test = (n) => test(n + 1); test(0); 它将永远挂起,并且不会导致堆栈溢出。浏览器将挂起,因为它是一个繁忙的循环,但它永远不会得到堆栈溢出,因为尾部调用

我听到很多人说递归可以是一个“无止境的循环”,但这句话是否只适用于循环。对于这样的递归,说“无止境循环”是否有效和正确?说“无止境递归”不是更好吗?

尾部递归可以被视为一个迭代循环。这是唯一一种不会以堆栈溢出错误迅速结束的无限递归类型

如果您在兼容的ECMAScript 2016实现中编写此代码

const test = (n) => test(n + 1);
test(0);
它将永远挂起,并且不会导致堆栈溢出。浏览器将挂起,因为它是一个繁忙的循环,但它永远不会得到堆栈溢出,因为尾部调用优化为如下内容:

const test = (n) => {
  while(true) {
    n++;
  }
}
test(0);

如果你认为底部一个是无限循环,第一个就不同了。


如果这是C,那么这两个程序都将使用gotos转换成非常相似的汇编代码,因为汇编既没有while循环,也没有函数。

就我个人而言,我一直认为递归是循环的一种形式。递归可以实现与内置循环构造相同的工作。@Carcigenicate虽然递归可以具有与循环相同的表面效果,但我非常不同意,递归是循环的一种形式。递归具有完全不同的执行语义、内存使用,甚至还有需要解决的目标/问题。有很多例子,其中递归似乎是在做某种“循环逻辑”,然而,你不能用循环轻松地实现同样的功能,反之亦然。@wisemovi递归将是无限的,如果你没有正确定义基本情况,或者如果你在任何递归分支中有其他无限问题。在不应该使用递归的示例中,递归经常被过度使用。它需要大量的内存。我不明白你问题的其余部分。。所以,对不起。@GiorgiTsiklauri我认为循环只是重复代码的任务。我认为内存使用情况或每种方法的具体实现与定义无关。@Carcigenicate以及如何决定使用哪种方法和时间(传统循环或递归方法)?基于什么标准?