-1

我听到人们说很多时候递归可以是一个“无限循环”,但那句话不是只适用于用循环完成的事情吗?对这样的递归说“无限循环”是否有效和正确?说“无限递归”不是更好吗?

4

1 回答 1

1

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

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

const test = (n) => test(n + 1);
test(0);

它将永远挂起,永远不会导致堆栈溢出。浏览器将挂起,因为它是一个繁忙的循环,但它永远不会发生堆栈溢出,因为尾调用被优化为如下所示:

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

如果您认为底部是无限循环,那么第一个并没有什么不同。如果这是 C,那么两者都将使用 goto 变成非常相似的汇编代码,因为汇编没有 while 循环或函数。

于 2020-09-04T22:23:32.253 回答