问题描述:
在使用递归方式写代码的时候会发现栈溢出和运行效率低的情况,在求斐波那契数的结果中会发现求的斐波那契数越大(例如:输入值为50)就会发现运行崩溃。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int count;//计数当x等于3时经历了几次
int fib1(int x)
{
if (x == 3)
count++;
//递归计算斐波那契数
if (x <= 2)//因为斐波那契数的前两个数都是1,所以从第三个数开始加起
return 1;
else
return fib1(x - 1) + fib1(x - 2);
}
int main()
{
int n;
scanf("%d", &n);
int m = fib1(n);
printf("%d\n", m);
printf("%d\n", count);
return 0;
}
原因分析:
通过添加全局变量count计数时发现,x==3的时候会不断被调用,说明该递归的方法做了很多重复计算的工作,导致运行效率下降,以及栈溢出。
解决方案:
对于递归的方法会出现大量重复计算,于是使用非递归的方法来解决该问题,其中迭代法也是一种不错的解决思路。
其中的c要等于1,因为当输入的数字为1或者2时,对应的斐波那契数都是1。
之后,通过c把前两个数a,b相加得到结果,再通过a=b,b=c交换位置,满足斐波那契数等于前两数相加的需求。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//迭代函数
int fib2(int y)
{
int a = 1;
int b = 1;
int c = 1;//这里c要等于1,因为当输入的数字为1或者2时,对应的斐波那契数都是1
while (y >= 3)
{
c = a + b;
a = b;
b = c;
y--;
}
return c;
}
int main()
{
int n;
scanf("%d", &n);
int z = fib2(n);
printf("%d", z);
return 0;
}