尾调用优化

Posted 欧欧欧锋_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尾调用优化相关的知识,希望对你有一定的参考价值。

参考: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

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

以上是关于尾调用优化的主要内容,如果未能解决你的问题,请参考以下文章

尾调用优化

iOS 的尾调用优化原理

iOS 的尾调用优化原理

尾调用及递归优化

Node.js 尾调用优化:可能与否?

为啥在这里使用 boost::multiprecision::cpp_int 会影响尾调用优化