为什么要优化递归
先看个例子:
// 递归裴波那切数列
function fibonacci(n) {
if (n>2) {
return fibonacci(n-1) + fibonacci(n-2);
} else {
return 1
}
}
function t(n) {
console.time('a');
console.log(fibonacci(n));
console.timeEnd('a')
}
t(35);
t(40);
t(42);
打印结果如下:
9227465
a: 57.330ms
102334155
a: 589.497ms
267914296
a: 1550.535ms
正常的递归函数,算到42就已经花费1.5s了,更不用说再往后算了
优化方法一:
var fibArr = [ undefined, 1, 1 ];
function fibonacci( n ){
var nFib = fibArr[ n ];
return nFib
? nFib
: ( fibArr[ n ] = fibonacci( n-1 ) + fibonacci( n-2 ) );
}
function t(n) {
console.time('a');
console.log(fibonacci(n));
console.timeEnd('a')
}
t(35);
t(40);
t(42);
打印结果如下:
9227465
a: 0.284ms
102334155
a: 0.088ms
267914296
a: 0.080ms
优化方式二:
function fibonacci(n) {
var x = 1, y = 1, i = 2, t;
while (i<n) {
t = y;
y = x + y;
x = t;
i++;
}
return y;
}
function t(n) {
console.time('a');
console.log(fibonacci(n));
console.timeEnd('a')
}
打印结果如下:
9227465
a: 0.416ms
102334155
a: 0.400ms
267914296
a: 0.170ms