首先是最简单的递归算法,相信很多初学者第一次接触递归这种算法都是从写一个斐波那契数列开始的。
这里除了递归算法之外我还会介绍循环算法
首先是最基础的递归算法
#include <stdio.h>
int f(int n)
{
if(n==1||n==2)
return 1;
else
return f(n-1)+f(n-2);
} #递归的逻辑
int main()
{
int n;
printf("请输入你想要斐波那契数列的个数\n");
scanf("%d",&n);
printf("斐波那契数列为:\n");
for(int i=1;i<=n;i++)
printf("%d\t",f(i));
return 0;
}
然后是循环算法,我这里定义了一个只有两个元素的整形数组,当然也可以用其他线性结构这里不多赘述了。
第一种循环的方式:在每一次循环的过程中我都会进行数组的值的更新,来保证每一次数组的这两个值都是斐波那契数列的最后两个值。
#include<stdio.h>
int a[2]={1,1};
int f(int n)
{
if(n>2)
{
for(int i=0;i<n-2;i++)
{ int x;
x=a[1];
a[1]=a[1]+a[0];
a[0]=x;
return a[1];
} #循环更新值并返回输出
}
else
return 1;
}
int main()
{
int n;
printf("请输入你想要斐波那契数列的个数\n");
scanf("%d",&n);
printf("斐波那契数列为:\n");
for(int i=1;i<=n;i++)
printf("%d\t",f(i));
return 0;
}
笔者最近在写shell程序设计的实验的时候重新书写这个斐波那契的时候发现采用循环的方式可以有和这个不一样更加容易理解的方式:
#include<stdio.h>
int main() {
int n;
printf("请输入个数:\n");
scanf("%d",&n);
int a[100]={0}; //先初始定义100个空间并且他们都是0
if(n==1) //是1的话就是只有一项
a[0]=1;
else //是2的话也可以下面的循环体不用做直接出来
{
a[0]=1;a[1]=1;
for(int i=2;i<n;i++)
{
a[i]=a[i-1]+a[i-2]; //整体思想直接就是前两项相加减
}
}
for(int i=0;i<n;i++)
printf("%d\n",a[i]);
}
斐波那契数列比较经典可以用几种不同的算法实现,有兴趣的可以尝试其他的解决方法。
代码运行截图