1.什么是斐波那契数列:
斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列、费波那西数列、费波拿契数、费氏数列和兔子数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*),用文字来说,就是斐波那契数列列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加。
学习内容:
这里我们针对以1,1,为前两项的斐波那契数列,(1,1,2,3,5,8,13……)某一项即为前两项的和,这里介绍三种方法来实现它
1.迭代法:
long fac(int x)//迭代
{
int i;
int a = 1;
int b = 1;
int c = 0;
for (i = 0; i < x - 2; i++)
{
c = a + b;
a = b;
b = c;
}
return c;
}
int main()
{
int a;
scanf("%d", &a);
printf("%d", fac(a));
return 0;
}
我们先将前两个1储存在a,b中,在第一个循环中,c接收了a和b的和,再让a接收b的值,b接收c的值。如此循环往复(x-2)次,最终c的值即为f(x).
在这过程中,a,b值的更新是为了令a=f(x-2),b=f(x-1).所需循环次数由下得出:
求第三项:只需进行一次循环,即进行一次相加
求第四项:进行两次循环,即进行两次相加
求第五项:进行三次循环,即进行三次相加
……
不难看出,求第x项时,就需要进行x-2次循环了
2.线性递归法
int fac(int x)//线性递归
{
if (x == 1 || x == 2)
return 1;
else
return fac(x - 2) + fac(x - 1);
此种方法很简单,就是根据数学定义按部就班:F1=1,F2=1,Fn=F(n-1)+F(n-2)(n>=3,n∈N*)
3.尾递归
int fun(int n,int a,int b)
{
if(n<3)
return b;
else
return fun(n-1,b,a+b);
}
int main()
{
printf("%d",fun(5,1,1));
return 0;
}
我们来验证一下fun函数的功能,首先传参时必须保证形参a,b都接收1,传递(5,1,1,),过程如下:
fun(4,1,2)
fun(3,2,3)
fun(2,3,5)
当n-1=2时,函数就会返回第三形参——5