尾递归支持缩短其他函数调用的堆栈吗?

2024-06-22

支持尾递归的语言可以将相同的技术应用于非递归函数调用吗?

例如,如果最后一个函数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(使用前将#替换为@)

尾递归支持缩短其他函数调用的堆栈吗? 的相关文章

随机推荐