从一个熟悉的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