尾递归究竟是好是坏?
概念
递归如果层次太多,就会照成栈溢出异常,因为每调用一次就会新生成一个栈帧,使用这个栈帧保留当前函数的状态值。如果没有必要保存状态值,那么就可以复用栈帧,不会造成栈溢出。
举例这里以求n的阶乘举例:
正常递归:
假如n=3;那么每一步都需要保留n值以及下一步函数的返回值,所以每次调用都需要创建一个新的栈帧
尾递归:
假如n=3,这里每一次调用是可以复用栈帧的,因为不需要保存状态值。
总结所以说当递归是在当前栈帧执行完之后,不需要再保留当前栈帧,而是带着当前栈帧的结果,进入到下一栈帧,就可以优化为尾递归,一般尾递归需要满足递归调用是函数体中最后执行的语句。比如阶乘的例子中最后执行的语句是直接调用factorial(n-1, n*result),而不是一个表达式n * factorial(n -1),如果是表达式的话就需要一个栈帧来保留n和factorial(n -1)的结果。
Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有