了解斐波那契数列
斐波那契数列的排列是:1,1,2,3,5,8,13,21,34,55,89,144……
依次类推下去,你会发现,它后一个数等于前面两个数的和。在这个数列中的数字,就被称为斐波那契数。
我们可以用循环的方式来实现一遍
输入一个n告知系统需要输出第几位斐波那契数
这里的while循环是为了输入多个不同n变量,进入循环,中f是为了告知第几位斐波那契数,因为循环中每循环一次n会--所以需要一个f来储存n的值.
然后代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int n;
printf("需要输出第几位斐波那契数:");
while (scanf("%d", &n) != EOF)
{
int i = 0, t = 0, fb = 1;
int f = n;
n = n - 1;
while (n)
{
i = t;
t = fb;
fb = i + t;
n--;
}
printf("第%d位斐波那契数为%d\n", f, fb);
}
return 0;
}
最后输入数字循环的结果是:
(第一百位斐波那契数执行不出来,是因为一个整形中能储存的最大数是有限的)
当然我们还能用递归来实现
代码如下:
int Fib(int n)
{
if (n > 2)
{
return Fib(n - 1) + Fib(n - 2);
}
else
return 1;
}
#include<stdio.h>
int main()
{
int n = 0;
while (scanf("%d", &n) != EOF)
{
int ret = Fib(n);
printf("第%d位斐波那契数为%d\n", n, ret);
}
return 0;
}
总的来说递归是更通俗易懂一点,不过用递归往往会耗费更多的时间,这里我们发现,这种递归写法虽然实现了该功能,但是效率较低,如果我们计算第40个斐波那契数的话,程序会执行很长一段时间。占用太多时间的原因就是编译器进行了大量的重复计算。
所以在我们写代码的过程中,递归递归固然能简化代码步骤,但有时候也不一定很合适,所有我们要选择写代码要选择最优的算法去解决问题。