求第n个斐波那契数
斐波那契数
1 1 2 3 5 8 13 21 …
fib(n)
n<=2 1
n>2 fib(n-1)+fib(n-2)
函数法
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int fib(int n)
{
if (n <= 2)
return 1;
else
return fib(n - 1) + fib(n - 2);
}
int main()
{
int n = 0;
printf("请输入求第几个斐波那契数\n");
scanf("%d", &n);
fib(n);
int ret = fib(n);
printf("第%d个斐波那契数为%d", n, ret);
system("pause");
return 0;
}
但是问题来了
递归向下的层次太深了效率大大降低
迭代(即为循环)
代码一
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int fib(int n)
{
if (n <= 2)
{
return 1;
}
else
{
int i = 0;
int a = 1;
int b = 1;
int c = 0;
//循环法就只能从前往后求
for (i = 2; i < n; i++)
{
c= a + b;
a = b;
b = c;
}
return c;
}
}
int main()
{
int n = 0;
printf("请输入求第几个斐波那契数\n");
scanf("%d", &n);
fib(n);
int ret = fib(n);
printf("第%d个斐波那契数为%d", n, ret);
system("pause");
return 0;
}
代码二
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int fib(int n)
{
int i = 0;
int a = 1;
int b = 1;
int c = 1;
for (i = 0; i <n-2; i++)
{
c= a + b;
a = b;
b = c;
}
return c;
}
int main()
{
int n = 0;
//int ret=0; 如果在外部定义 之要除了循环ret 永远是0
printf("请输入求第几个斐波那契数\n");
scanf("%d", &n);
fib(n);
int ret = fib(n);
printf("第%d个斐波那契数为%d", n, ret);
system("pause");
return 0;
}
相比较而言 代码二 在函数内部进行了一些优化。
代码一是选择语句加循环语句
代码二是只有循环语句
代码会更加简洁一些
== 如果函数法存在明显的缺陷,那就使用迭代法==
尽管迭代法相对来说比较复杂,但还是要掌握。
最后
这两天不知道咋了,好像厌学了一样。
本来这个两天前就写了一半 也一直在草稿箱里面放着,然后就没有然后。
真的在家有点颓。