这是一个水题,但是却花费了我一些功夫来研究,所以将其记录下来。刚开始看到题目的时候,我脑袋是晕的,当我试着将前几级楼梯的不同走法计算了一下,发现这不是斐波拉契数列嘛,把自己包装的这么严实。一想到斐波拉契数列就想到了递归,因此我就写了个递归,提交之后,结果超时。递归需要一层层的将结果计算出来,因此有可能同一结果要计算很多遍这样就会很浪费时间。因此,我就想用一个数组将计算结果保存起来,如果数组里面已经保存了其值,则直接用于计算,就免除了重新计算消耗的时间了。
#include <stdio.h>
int a[45] = {0};
int f(int n)
{
if(a[n-1] && a[n-2])
return a[n-1]+a[n-2];
else
{
if(n == 2)
{
a[2] = 1;
return a[2];
}
if(n == 3)
{
a[3] = 2;
return a[3];
}
a[n] = f(n-1)+f(n-2);
return a[n];
}
}
int main()
{
int n,M,i,cou;
scanf("%d",&M);
for(i = 0;i <M;i++)
{
cou = 0;
scanf("%d",&n);
cou = f(n);
printf("%d\n",cou);
}
return 0;
}