//斐波纳契数列
是一组这样的数字:
0,1,1,2,3,5,8,13,21,34……
在数学上,斐波那契数列是以递归的方式定义:
f(0) = 0;
f(1) = 1;
f(n) = f(n-1)+f(n-2);
//1 1 2 3 5 8 ……
写法一:
function num(n){
if( n==0||n==1){
return n;
}
if(n>=2){
return num(n-1)+num(n-2);
}
}
num(5);
写法二:
function num(n){
return n<2 ? n: num(n-2) + num(n-1);
}
num(10);
在这里我们会发现执行num(10),等价于执行num(9)和num(8),
相当于 num(10) = num(9) + num(8)
num(9)= num(8)+num(7);
num(8)= num(7)+num(6);
我们可以发现
num(8)和num(7)被重复执行,这样的话就会延长程序的执行时间,num()函数里面的参数是10,我们看不出什么,但改为30或者50呢?经过我的测试如果为50的话,五分钟时间都没有执行结果,大家不信可以测试,但如果我们把每次执行过的保存起来,所用的时间不会超过1s。下面的代码可以帮助我们深入的理解。
var cache = {
0:0,
1:1
}
function num(n){
if(typeof cache[n] === 'number'){
return cache[n];
}
var result = cache[n] = num(n-1) + num(n-2);
return result;
}
num(10);
通过这种方式的话,num(50),1s就可以执行完,就是这么神奇。
[参考资料]
1.(http://www.cnblogs.com/jiancui/archive/2017/02/09/fibonacci.html)
2.(http://www.jianshu.com/p/0b32ce736c24)