百度斐波那契数列定义:
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)
方法一:递归
思路:创建一个计算第n项斐波那契数的函数,通过不断调用此函数计算(n-1),(n-2),(n-3)....2然后一次返回到第n向。下面展示代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int Fib(int n)
{
if (n <= 2)
return 1;
else
return Fib(n - 1) + Fib(n - 2); //递归计算(n-1),(n-2)项
}
int main()
{
int n = 0;
printf("请输入想要计算的第几项:>");
scanf("%d", &n);
int ret = Fib(n); //创建Fib()函数并用变量ret接收返回值
printf("%d", ret);
return 0;
}
运行效果:
这里我们计算第10项的值,那么我们计算第50项值呢?
这并不是程序崩溃的原因,这是电脑还在计算,那么为什么计算第50项所耗时间这么久呢?
这里我们画了一个简图描述这个算法,我们计算第50项的话,要不断重复计算第3项,第4项......第48项,且项数越小被计算次数越多。所以这种算法不建议计算较大的数值!!!
方法二:迭代
思路:通过循环(n-2)+(n-1)=(n)(n>2)这个表达式计算第n项数值,每循环一次赋值一次如(n-2)->(n-1),(n-1)->(n)然后在计算下一项。下面展示代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int Fib(int n)
{
int a = 1;
int b = 1;
int sum = 0;
if (n <= 2)
return 1;
else
{
while (n > 2)
{
sum = a + b;
a = b;
b = sum;
n--;
}
return sum;
}
}
int main()
{
int count = 0;
int n = 0;
printf("请输入想要计算的第几项:>");
scanf("%d", &n);
int ret = Fib(n); //创建Fib()函数并用变量ret接收返回值
printf("%d", ret);
return 0;
}
运行效果:
这种方法并不会重复计算某一项的值,所有算法耗时少,效率高。
总结:
在我们写代码的过程中,递归递归固然能简化代码步骤,但有时候也不一定很合适,所有我们要选择写代码要选择最优的算法去解决问题。