先描述一下题:
有m(m>0)个台阶,每次只能跨越一个或者两个台阶,一共有多少种走法(如果m=1走法为0)?
首先我们先分析一下:
看到上面两个表格,你会发现走台阶的的本质是求第m个斐波那契数,数学真是奇妙。求第m个斐波那契数有两种基本的方式:循环或者递归。
采用递归的方式:
# include <stdio.h>
int number;
int fact(int m)
{
if(m<=1)
return 0;
else if(m==2)
return 1;
else if(m==3)
return 2;
else
return fact(m-2)+fact(m-1);
}
int main()
{
int m;
scanf("%d", &m);
number = 0;
scanf("%d", &m);
number = fact(m);
printf("%d\n", number);
return 0;
}
采用for循环的方式:
# include <stdio.h>
int number;
void fact(int m)
{
int x1=1, x2=1, x3;
if(m==1)
return ;
if(m==2)
number=x2;
if(m>2)
{
for(int i=0; i<m-2; i++)
{
x3=x1+x2;
x1=x2;
x2=x3;
}
number=x3;
}
}
int main()
{
int m;
scanf("%d", &m);
number = 0;
scanf("%d", &m);
fact(m);
printf("%d\n", number);
return 0;
}
经过测试,当m=40的时候,递归的算法就半天才出结果,循环的算法立即就出来结果,两种算法的效率高低立判。
所以解决问题时,如果计算数据量很小,递归的低效不太明显。如果计算量很大,能减少使用递归就减少使用递归。