首先我们来看一下什么叫斐波那契数列:
斐波那契数列是指这样一个数列:
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);但现在随着硬件的发展,空间复杂度已经不那么重要了。
所以总体来说非递归的算法效率更高。