一、问题

一只青蛙跳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时算出来的时间并留下你的感悟吧

如果你有其他更好的想法,请在评论区分享给大家吧