题目描述:
求第n个斐波那契数,在本篇博客中讲述两种方法:
一是利用递归调用函数实现,
一种是非递归循环实现
首先要了解什么是斐波那契数列,斐波那契数列的特征是前两个数是1,其后数为前两数之和,如
一、递归实现
#include<stdio.h>
#include<stdlib.h>
int fib(int n)
{
if(n<=2)
{
return 1; //前两个数为1
}
else
{
return fib(n-1)+fib(n-2); //第n个数值为前两数之和,形成函数调用
}
}
int main()
{
int n = 0;
int ret = 0;
printf("请输入要求的斐波那契项数n:\n");
scanf("%d",&n);
ret = fib(n);
printf("第n个斐波那契数为:%d\n",ret);
system("pause");
return 0;
}
递归调用程序代码看起来简单,一目了然,可是如果要求数字序列大,在栈里函数重复调用,最后返回,计算时间较长,效率低下,所以我们要有选择性的使用递归。
为了提高效率,避免重复调用,代码运行开销过大,下面我们用循环实现,每次将数据保存,可避免重复计算,
二、循环实现
#include<stdio.h>
#include<stdlib.h>
int fib(int n)
{
int a = 1; //前两项均为1
int b = 1;
int c = 0;
c = a + b;
b = a ;
c = b ;
while(n>2) //循环条件
{
c = a + b;
a = b; //a,b均为前两项
b = c;
n--;
}
return c;
}
int main()
{
int n = 0;
int ret = 0;
printf("请输入要求的斐波那契项数n:\n");
scanf("%d",&n);
ret = fib(n);
printf("第n个斐波那契数为:%d\n",ret);
system("pause");
return 0;
}
运行结果