尾调用优化

参考:http://www.ruanyifeng.com/blog/2015/04/tail-call.html  

感谢阮老师。

尾调用的概念非常简单,一句话就能说清楚,就是指某个函数的最后一步是调用另一个函数。

//正确的尾调用
function f(x) {
  if (x > 0) {
    return m(x)
  }
  return n(x);
}

function f(x){
  return g(x);
}

//非尾调用
// 情况一
function f(x){
  let y = g(x);
  return y;
}

// 情况二
function f(x){
  return g(x) + 1;
}

如果尾调用自身,就称为尾递归。

//一般的递归写法,复杂度 O(n) ;准确来说是空间复杂度;
function factorial(n) {
  if (n === 1) return 1;
  return n * factorial(n - 1);
}

factorial(5)        // 120


//尾递归的写法,复杂度 O(1) 。
function factorial(n, total) {
  if (n === 1) return total;
  return factorial(n - 1, n * total);
}

factorial(5, 1)     // 120

递归的写法推荐用尾递归。

原文地址:https://www.cnblogs.com/oufeng/p/6368898.html