從一個熟悉的Fibonacci數列的實現開始:
function Fibonacci (n) {if ( n <= 1) { return 1};return Fibonacci(n -1) + Fibonacci(n-2);
}
以上代碼很簡單…
但執行以下代碼
console.log(Fibonacci(100));
會發現編譯工具,卡住不動.
原因在于:遞歸調用(函數調用自身),每次都會占用一定內存來保存調用幀…Fibonacci(100),直接導致堆棧溢出…
解決方法:
改為尾遞歸調用(代碼如下):
function Fibonacci2(n, ac1=1, ac2=1){if (n <= 1) {return ac2};return Fibonacci2(n-1, ac2, ac1+ac2);
}
執行以下代碼看看:
console.log (Fibonacci2(100));
console.log(Fibonacci2(1000));
誒,成功了…
下面介紹優化的原理:
// 考慮函數:
function f(){let m = 1;let n =2;return g(m+n);
}
f();// 等同于
function f() {return g(3);
}
f();// 等同于
g(3)
函數f(),最后一步都是調用g().
最終的調用幀可以縮減到1個g(3)…
因此大大的減少了內存的消耗
參考 《ES6標準入門》(第3版) P126