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

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

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

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

接下来看两个计算第n个斐波那契数的代码:
#include
#include
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;
}

运行结果如下:

从时间复杂度和空间复杂度来看斐波那契数列_第1张图片

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

时间复杂度

递归算法:
从时间复杂度和空间复杂度来看斐波那契数列_第2张图片

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

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

空间复杂度
从时间复杂度和空间复杂度来看斐波那契数列_第3张图片

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

你可能感兴趣的:(C语言)