尾递归优化

“尾递归优化”的含义是:如果递归函数属于尾递归,那么运行时会优化其调用过程。优化主要针对调用栈,将多层调用,转化为一层调用。

递归的概念很简单,就是函数调用自身。而所谓的“尾递归”就是在函数体的最后才调用自身。例如:

var fn = function(m, n) {
  var x = m + 1
  var y = n * 2 
  fn(x, y)
}

fn(1, 2)

在上述例子中,函数fn在其函数体的最后又调用了自己,fn。这就叫尾递归。

递归调用其实跟普通函数调用并没有本质的不同,都是函数调用函数。但是普通函数调用的层次一般不会太深,这跟设计时的逻辑分层有关。但是递归就不一样了,一不小心就可能产生很多层的调用。试想一下,如果一个递归一直没有返回直接结果,而是一直在调用自身。那么每次调用,函数中的变量、参数都会压栈。由于没有返回,这些栈空间得不到释放,栈很快就会溢出。
当然,设计好的递归调用一般不会产生这样的情形。大多数类似的错误都会在开发阶段发现并解决。比较常见的情形是递归层次较多,栈空间被占用了很多。

而如果是尾递归,由于函数返回的是最后的语句,也就是说返回值只跟最后的调用有关系,那么函数中的变量显然就没有必要保存了。因此针对上述例子,最终可以优化成:

fn(2, 4)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 什么是尾递归 如果一个函数在定义时引用了自身,那么这个函数就是一个递归函数。例如我们所熟知的阶乘就可以通过递归函数...
    Liutos阅读 4,181评论 0 1
  • 原文出处: neo1218 一般递归与尾递归 一般递归 执行: 可以看到, 一般递归, 每一级递归都需要调用函数,...
    PyChina阅读 6,094评论 1 8
  • 1.什么是递归? 程序调用自身的编程技巧称为递归( recursion),就好像你做了一个梦,梦里面梦到梦到自己又...
    梦想怪阅读 4,589评论 0 2
  • 以递归方式思考 递归通过灵巧的函数定义,告诉计算机做什么。在函数式编程中,随处可见递归思想的运用。下面给出几个递归...
    JasonDing阅读 5,281评论 0 1
  • lua程序设计 书中原文 Lua中函数的另一个有趣的特征是可以正确的处理尾调用(proper tail recur...
    人气小哥阅读 9,230评论 0 0