我听到人们说很多时候递归可以是一个“无限循环”,但那句话不是只适用于用循环完成的事情吗?对这样的递归说“无限循环”是否有效和正确?说“无限递归”不是更好吗?
问问题
176 次
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 回答