【发布时间】:2011-01-25 11:12:09
【问题描述】:
【问题讨论】:
【问题讨论】:
a 调用 b 调用 c 调用 d。
最后你有尾巴:
d 返回 c 返回 b 返回 a。如果所有这些都不做(例如在递归中,实际上是a调用a调用a调用a),那么您可以优化它... ...进入 d 返回到 a。
【讨论】:
尾递归并不意味着将递归调用变成循环。
这意味着在递归调用点不再需要堆栈帧,因此可能会被消除。如果递归调用是方法中的最后一条语句,并且递归调用的返回值是当前方法的返回值,则会发生这种情况。通过消除当前堆栈帧,递归调用可以进入任意深度,而不会出现堆栈溢出错误,并且可以节省大量资源。
这种优化通常由编译器/解释器而不是程序员进行。
【讨论】:
在JavaScript: The Good Parts 中,Crockford 说:“一些语言提供尾递归优化。这意味着如果函数返回递归调用自身的结果,那么调用会被循环替换,这可以显着加快处理速度。 "
【讨论】: