从时间复杂度和空间复杂度来看斐波那契数列

首先我们来看一下什么叫斐波那契数列:

斐波那契数列是指这样一个数列:

1 1 2 3 5 8 13 21 34 55 ~ ~ ~等这样的一组数列。
它的规律是第三个数等于前两个数之和

接下来看两个计算第n个斐波那契数的代码:
#include<stdio.h>
#include<stdlib.h>
int Fibonacci_1(size_t n)//注意返回值可能会很大,但c语言中最大整数为4294967295
{                        //测试后只能计算前46个斐波那契额数列
	int  first,second,third;//非递归算法
	int i;
	first=0;
	second=1;
	if(n<=2)
	{
		return 1;
	}
	for(i=2; i<=n; i++)
	{
		third=first+second;
		first=second;
		second=third;
	}
	return third;
}
int Fibonacci_2(size_t n)//递归算法
{
	if(n<=2)
	{
		return 1;
	}
	else
		return Fibonacci_1(n-1)+Fibonacci_1(n-2);
}
int main()
{
	size_t n=40;
	printf("非递归算法第%d个斐波那契数为>:%d\n",n,Fibonacci_1(n));
	printf("递归算法第%d个斐波那契数为>:%d\n",n,Fibonacci_2(n));
	system("pause");
	return 0;
}

运行结果如下:

在这里插入图片描述

两个代码看起来相差不了多少,但从时间复杂度和空间复杂度上比较,还是相差很远的。

时间复杂度

递归算法:
在这里插入图片描述

非递归: 通过观察循环次数就可以发现,非递归只需要循环 n次就可以计算出第n个斐波那契数,所以它的时间复杂度时O(n);

这时当假如n为100时,递归算法需要计算2^100次,二非递归只需要计算100次,这时候递归算法可能需要很长一段时间,而非递归却很快,这就通过时间复杂度体现了两者算法的差别。

空间复杂度
在这里插入图片描述

而非递归方法开辟了三个变量空间,空间复杂度为O(1),而递归的是O(n);但现在随着硬件的发展,空间复杂度已经不那么重要了。
所以总体来说非递归的算法效率更高。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值