1、斐波那契数列(1,1,2,3,5,8,13,21...)
最简单的实现
function f1(n){
// i++; //判断递归次数
if(n <= 2) return 1;
return f1(n-1) + f1(n-2);
}
这是最简单的实现,但我们知道递归次数多了非常耗内存,对性能总是不好的。所以可以用其他方法实现
function f2(n){
var cache = [1,1,1];
function _fn(n){
// i++; //判断递归次数
if(cache[n]) return cache[n];
cache[n-1] = _fn(n-1);
cache[n-2] = _fn(n-2);
return cache[n-1] + cache[n-2];
}
return _fn(n);
}
该方法主要是将取过的值缓存(这里是用一个数组)起来,这样再读取该值时直接从缓存中拿到就可以了,从而省去了一部分递归。以上两种方法在传入的n数值小的时候还好,如果n的值稍大一点,第一种方法会直接崩溃。下面是两者的一些执行性能上的差异,当n=40时
console.log(f1(40), i, Date.now()-t) //值为102334155,递归次数204668309,耗时2112ms
consol