目录
什么是斐波那契数列
- 斐波那契数列是指这样一个数列:1,1,2,3,5,8,13,21,34,55,89……
- 这个数列从第3项开始 ,每一项都等于前两项之和
求第n个斐波那契数(递归求解)
- 创建int整型n变量,scanf函数接收n的值
- 创建Fib函数
- Fib函数的参数:求的是第n个斐波那契数是多少,并不会改变n的值,所以函数的实参为值传递n的值
- Fib函数的返回值:斐波那契数列都为整数,所以求第n个斐波那契数出后通过int整型返回
- 接收Fib的返回值并打印求证
Fib函数的具体实现
- 当n<=2时:第n个斐波那契数为1
- 当n > 2时:第n个斐波那契数为Fib(n-1) + Fib(n-2)
- Fib(n-1)为前一个斐波那契数
- Fib(n-2)为前前一个斐波那契数
- 由以上公式,则可以编写代码
#include<stdio.h>
int Fib(int n)
{
//n小于等于2时,直接返回1
if (n <= 2)
{
return 1;
}
else//n大于2时,返回前一个斐波那契数和前前一个斐波那契数之和
{
return Fib(n - 1) + Fib(n - 2);
}
}
int main()
{
//创建int整型n变量
int n = 0;
//输入
scanf("%d", &n);
//Fib函数计算后接收返回值
int ret = Fib(n);
//打印验证
printf("第%d个斐波那契数为:%d\n", n, ret);
return 0;
}
递归求解第n个斐波那契数的弊端
- 当你输入第5个或者第10个斐波那契数时,会很快计算出来
- 但当你想知道第50个斐波那契数时,会发现以上代码运行后迟迟不能计算出结果
通过测试可以发现,计算第40个斐波那契数的时候,当n为3时,被重复多次使用,大量的重复工作,导致运行速度缓慢,所以并不建议使用递归求解第n个斐波那契数
求第n个斐波那契数(迭代求解)
- 创建变量a,赋值为第一个斐波那契数
- 创建变量b,赋值为第二个斐波那契数
- 创建变量sum,赋值为a+b的和,也就是第三个斐波那契数
- 求解第n个斐波那契数,循环n-2次
- 每次循环:将a+b的值赋值给sum,a赋值为b的值,b赋值为sum的值,此时的a和b都各自指向了自身的下一个斐波那契数,再次求和赋值给sum……
- 当循环结束时,sum就是第n个斐波那契数
#include<stdio.h>
int Fib(int n)
{
//n<=2时,同样直接返回1
if (n <= 2)
return 1;
//以下代码逻辑为n>2的情况
int a = 1; //第一个斐波那契数
int b = 1; //第二个斐波那契数
int sum = 0;
//i从2开始,循环n-2次
for (int i = 2; i < n; i++)
{
sum = a + b; //b的后一个斐波那契数
a = b; //把a赋值为a的下一个斐波那契数
b = sum; //把b赋值为b的下一个斐波那契数
}
//当循环结束时,sum就是第n斐波那契数
return sum;
}
int main()
{
//创建int整型n变量
int n = 0;
//输入
scanf("%d", &n);
//Fib函数计算后接收返回值
int ret = Fib(n);
//打印验证
printf("第%d个斐波那契数为:%d\n", n, ret);
return 0;
}
- 此时的代码就可以轻松计算出第40,甚至第50个斐波那契数了
- 以上地代码逻辑是从第1个和第2个斐波那契数依次递增得到的第n个斐波那契数
- 所以并不会存在大量的重复计算