[学习笔记]Fibonaci数列的递归与非递归算法实现

本文探讨了斐波那契数列的递归与非递归算法实现。递归方法虽然直观但时间复杂度高,而非递归方法采用循环计算避免了重复计算,显著提高了效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       前一阵一直在忙实验室的事情,博客就暂时放下了,这次和大家分享一下Fibonaci数列的递归与非递归两种算法实现。

       想必Fibonaci数列大家肯定都特熟,当输入正整数n为0或1时,f(0)=0,f(1)=1;当n大于1时f(n)=f(n-1)+f(n-2)。算法想必大家闭着眼睛都能写出来,典型的递归!如下:

long long Fibonaci1(unsigned int n)   //递归算法
{
	if(n <= 1)
		return n < 1 ? 0 : 1;

	return Fibonaci1(n - 1) + Fibonaci1(n - 2);
}
       通常来说,听到Fibonaci我们首先想到的就是递归,但是这并不能说明递归最适合这个题目。例如,我们要算f(10),首先要分别求f(9)和f(8);同样,要算f(9),就得先算f(8)和f(7);要求f(8)就得先求f(7)与f(6),以此类推。。。看出来了吗,大量的重复计算哦~大家可以把这个结构画成二叉树,就可以看出当n越大,重复的节点数将急剧增大,计算量也因此大大增加,实际上,此算法的时间复杂度是以n的指数的方式增加的。

       看起来对这个问题递归不怎么划算呢~既然递归不好用,那就循环吧!

       大致思想为:从底到上计算,即先根据f(0)和f(1)计算出f(2),再通过f(1)和f(2)计算出f(3),以此类推,直到f(n)为止。这样就能避免了大量的重复计算,其时间复杂度为O(n)。代码如下:

long long Fibonaci2(unsigned int n)
{
	if(n <= 1)
		return n < 1 ? 0 : 1;

	long long fibNMinusOne = 1;
	long long fibNMinusTwo = 0;
	long long fibN = 0;

	for(unsigned int i = 2;i <= n;i++)
	{
		fibN = fibNMinusOne + fibNMinusTwo;
		fibNMinusTwo = fibNMinusOne;
		fibNMinusOne = fibN;	
	}
	return fibN;
}

       很简单吧,而且一下就降低了时间复杂度!

       好了,今天天气不错,阳光好还不热,可以听首老摇滚写写代码什么的,哈哈,祝大家好心情吧!大笑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值