斐波纳契数列

本文介绍了斐波纳契数列的基本概念及其递归定义,并探讨了两种不同的实现方式。通过对简单递归方法的分析,揭示了其在大规模数值计算时存在的问题。文章进一步提出了一种使用缓存机制来优化计算过程的方法,显著提高了计算效率。

//斐波纳契数列
是一组这样的数字:

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值