c语言斐波那契数列_斐波那契数列的递归实现及优化

一、递归实现

斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、......这个数列的规律就是从第三项开始的每一项都等于前面两项的和,例2=1+1 ,8=3+5,用函数表示就是F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2),下面我们用递归实现一下

function fib(n){
        if(n<3) return 1
        return fib(n-1) + fib(n-2)
}
console.log(fib(5))
输出5

用递归的方法实现此数列确实挺简洁,方便理解。但是我们仔细观察上面的代码,就会发现此函数中存在着大量的冗余计算,并且n越大,冗余的越多。例如下图:

1b9d24795f4473e9a7a03c8e7c1f85f4.png
递归计算过程

图中每个分支上的函数都是单独调用的,并且都是重复的调用,针对这种冗余计算,我们可以做相关的优化,优化的思路都是减少相同函数的重复调用。

二、优化

方法一、使用非递归实现

function fb(n) {
	let last1=1,last2=1,temp
	for(let i=3;i<=n;i++){
		temp = last1+last2
		last1=last2
		last2=temp
	}
	return last2
}

两个指针在同步的向后移动

方法二、使用空间换效率

function fib(n){
	let arr = [0,1,1]
	for(let i=3;i<=n;i++){
		arr[i]=arr[i-1]+arr[i-2]
	}
	return arr[n]
}

把计算出的值放到数组里

方法三、使用缓存

function fib(n){
	let cache=[0,1,1]
	function _fib(n){
		if(cache[n]) return cache[n]
		cache[n] = _fib(n-1) + _fib(n-2)
		return cache[n]
	}
	return _fib(n)
}

把分支里涉及到的冗余计算放到数组中,用到的时候,直接拿出来用就行,而不用再计算一次。

以上就是递归的优化方法。

本文内容参考自饥人谷前端课程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值