求第n个斐波那契数。(不考虑溢出)
较为粗暴的解法
//斐波那契数列1 1 2 3 5 8 13 21:前两个数之和等于第三个数
#include <stdio.h>
int Fib(int n)
{
if (n <= 2)
return 1;
else
return Fib(n - 1)+Fib(n - 2);
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d", &n);
ret = Fib(n);
printf("ret=%d\n", ret);
return 0;
}
但是我们发现有问题;
在使用 fib 这个函数的时候如果我们要计算第50个斐波那契数字的时候特别耗费时间。
使用 factorial 函数求10000的阶乘(不考虑结果的正确性),程序会崩溃。
我们发现 fib 函数在调用的过程中很多计算其实在一直重复。 如果我们把代码修改一下:
//斐波那契数列1 1 2 3 5 8 13 21:前两个数之和等于第三个数
#include <stdio.h>
int count = 0;
int Fib(int n)
{
if (n == 3)//测试第三个斐波那契数的计算次数
count++;
if (n <= 2)
return 1;
else
return Fib(n - 1)+Fib(n - 2);
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d", &n);
ret = Fib(n);
printf("ret=%d\n", ret);
printf("count=%d\n", count);
return 0;
}