我一直在阅读很多关于尾递归的文章。但是我还不清楚尾递归如何不使用堆栈空间。
局部变量和函数参数怎么样?它们也存储在堆栈中。在尾递归的情况下会发生什么?它与正常递归有什么不同。
“尾部调用[tail recursion]是一种打扮成电话的goto”
这究竟意味着什么?
答案 0 :(得分:3)
遗忘了局部变量。尾调用递归的全部意义在于它是函数中最后发生的事情,因此调用后局部变量无关紧要。事实上,没有一个“跟注之后”是尾调用优化的全部内容。
编辑:关于报价:
在尾部调用优化的场景中,这两个是等效的:
fn(x) {
....
fn(y);
}
和
fn(x) {
start:
....
x = y;
goto start;
}