尾调用优化
参考: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
递归的写法推荐用尾递归。