一、问题
一只青蛙跳n个台阶,每次只能跳1个台阶或者2个台阶,请问一个有多少种跳法?
二、分析
①当n=1时,青蛙只有1种跳法,只跳1步;
②当n=2时,青蛙有两种跳法,跳2个1步据哦这跳2个1步;
③当n>2时,青蛙第一步有两种跳法,要么跳1步,要么跳2步,
如果先跳1步,接下来的跳法数量与n-1个台阶跳法相同;
如果先跳2步,接下来的跳法数量与n-2个台阶跳法相同;
那么n个台阶的跳法,就等于n-1个台阶跳法和n-2个台阶跳法之和;
n-1又可以拆分成n-2和n-3;n-2又可拆分成n-3和n-4;
如此拆分下去,直到n-x=1,或者n-x=2,返回值1或者2从此算出n个台阶的跳法
三、算法
像这种拆分问题首先想到的就是函数的递归
先写出主函数:
int main()
{
int n = 0,m=0;//n来存放台阶数,m来存放跳法数
printf("请输入台阶数:<");
scanf("%d",&n);
m=fun1(n);//m的值用自定义函数fun1来算取
printf("共有%d种算法\n",m);
return 0;
}
这时去写自定义fun1函数
int fun1(int n)
{
if(n<=1)//方便n=2时计算
return 1;
else
return fun1(n-1)+fun1(n-2);//根据分析的圈3
}
这个问题其实也就是一个斐波那契数列,下一位数等于前两位数相加;
1 1 2 3 5 8 13 21 34 55·········
但是使用函数递归法计算效率低,重复计算很多次小的底数,n=50时就要花费很多的时间来算
推荐使用循环来写,看到这里的小伙伴们,就自己动手用循环写一下吧,分别比较一下两种写法n=50时算出来的时间并留下你的感悟吧
如果你有其他更好的想法,请在评论区分享给大家吧