求第n个斐波那契数,在本篇博客中讲两种方法:一是利用递归调用函数实现,另一种是利用迭代求出第n个斐波那契数。
首先要了解什么是斐波那契数列,斐波那契数列的特征是前两个数是1,其后数位前两个数之和,如 1 1 2 3 5 8....
下面给出利用递归调用实现,程序代码如下:
#include <stdio.h>
int fib(int n) //函数实现返回斐波那契数值
{
if (n <= 2)
{
return 1; //前两个数为1
}
return fib(n - 1) + fib(n - 2); //第n个数值为它前面两个数之和,形成函数调用
}
int main()
{
int h = 0;
printf("please enter the number:");
scanf("%d", &h);
printf("%d\n", fib(h));
system("pause");
return 0;
}
输入你想要求的数字,运行结果如下图:
递归调用使程序代码看起来精简一目了然,程序可读性较强,可是如果要求的数字序列号很大,在栈里函数会不停调用,最后返回值,程序调用开销太大,可能计算时间也会很长,效率也会特别低。
为了避免程序代码运行开销过大,程序效率不高,有时不用递归调用来实现一个项目,下面用另一种方法来实现(迭代),利用迭代,要求的数等于它前面两数的和,循环起来;
程序代码如下:
#include <stdio.h>
int fibmine(int n)
{
int first = 1;
int second = 1;
int now = 1;
while (n-- > 2) //循环条件n>2
{
now = first + second;
first = second;
second = now;
}return now; //返回值now
}
int main()
{
int h = 0;
printf("please enter the number:");
scanf("%d", &h);
printf("%d\n", fibmine(h));
system("pause");
return 0;
}
程序运行结果如下:
它的好处是节省了代码开销,避免了递归调用函数不停调用最后递归的开销,可以很快地求出某个斐波那契数,效率较快。