斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”。
1, 1 , 2 , 3 , 5 , 8 , 13, 21, 34,… …
第n项等于前两项和。
循环实现
函数实现:
int fib1(int n) {
if (n == 1) {
//斐波那契数第一项为1,特殊情况先举例更简单
return 1;
}
if (n == 2) {
//斐波那契数第二项也是1
return 1;
}
// 这俩变量分别表示第 i - 1 项和第 i - 2 项
int last1 = 1;
int last2 = 1;
int cur = 0;
for (int i = 3; i <= n; i++) {
//i从第三项开始
cur = last1 + last2;
last2 = last1;
last1 = cur;//依次循环赋值实现一直求和
}
return cur;
}
主函数实现:
int main()
{
int n = 0;
printf("输入要求的斐波那契数:\n");
scanf("%d", &n);
printf("%d", fib1(n));
return 0;
}
递归函数实现
函数实现:
int fib2(int n) {
if (n == 1) {
//斐波那契数第一项为1,特殊情况先举例更简单
return 1;
}
if (n == 2) {
//斐波那契数第二项也是1
return 1;
}
return fib2(n - 1) + fib2(n - 2);//前一项和加后一项和
}
主函数实现:
int main()
{
int n = 0;
printf("输入要求的斐波那契数:\n");
scanf("%d", &n);
printf("%d", fib2(n));
return 0;
}
注意:当数字很大的时候,递归实现的时间要远大于循环,是因为递归的实现冗余度非常大,做了很多重复计算。类似于二叉树的样子:
每增加一个数字会带来很多很多的重复计算。