问题描述
我听到人们说很多时候递归可能是一个“无止境的循环”,但这并不是说仅适用于循环完成的事情。对这样的递归说“无限循环”是否正确和正确?说“无尽递归”会更好吗?
解决方法
尾部递归可以视为迭代循环。这是唯一不会立即以堆栈溢出错误结束的无限递归类型。
如果您在兼容的ECMAScript 2016实施中编写此代码
const test = (n) => test(n + 1);
test(0);
它将永远挂起并且永远不会导致堆栈溢出。浏览器会因为忙碌的循环而挂起,但永远不会出现堆栈溢出,因为尾部调用已优化为以下形式:
const test = (n) => {
while(true) {
n++;
}
}
test(0);
如果您将最下面的一个视为无限循环,则第一个不变。 如果这是C语言,那么两者都将使用gotos转换为非常相似的汇编代码,因为汇编既没有while循环,也没有函数。