支持尾递归的语言可以将相同的技术应用于非递归函数调用吗?
例如,如果最后一个函数foo
所做的是返回调用的值bar
,语言可能会丢弃foo
的堆栈框架?是否有已知的语言可以真正做到这一点?
Erlang 确实如此 http://learnyousomeerlang.com/recursion:
此处所示的尾递归不会使内存增长,因为当
虚拟机在尾部看到一个调用自身的函数
(函数中要计算的最后一个表达式),它消除了
当前堆栈帧。这称为尾调用优化 (TCO)
这是名为 Last Call 的更通用优化的特例
优化(LCO)。
每当函数中要计算最后一个表达式时,就会完成 LCO
body 是另一个函数调用。当这种情况发生时,就像 TCO 一样,
Erlang VM 避免存储堆栈帧。因为这样的尾递归是
也可以在多个功能之间。举个例子,链
函数 a() -> b()。 b() -> c()。 c() -> a()。将有效创造
由于 LCO 避免了溢出,因此不会出现内存溢出的无限循环
堆栈。这个原理与我们对累加器的使用相结合是
是什么让尾递归有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)