可能重复:
What is tail-recursion?
什么是尾递归优化?
答案 0 :(得分:5)
来电b调用c来电d。
最后你有尾巴:
d返回c返回b返回a。如果所有这些都没有做任何事情(比如在递归中,它实际上是一个调用,调用一个调用a),那么你可以优化... ...进入d返回a。
答案 1 :(得分:5)
尾递归并不意味着您将递归调用转换为循环。
这意味着在递归调用时不再需要堆栈帧,因此可以将其删除。如果重新调用是方法中的最后一个语句,并且递归调用的返回值是当前方法的返回值,则会发生这种情况。通过消除当前的堆栈帧,递归调用可以在没有堆栈溢出错误的情况下进入任意深度,并且可以节省大量资源。
这种优化通常由编译器/解释器而不是程序员完成。
答案 2 :(得分:0)
在JavaScript: The Good Parts中,Crockford说,“有些语言提供尾递归优化。这意味着如果函数返回递归调用自身的结果,那么调用将被循环替换,这可以显着加快速度“起来。