1.问题
一只青蛙可以一次跳一级台阶,也可以一次跳两级台阶,如果青蛙要跳上n级台阶,共有多少种跳法?
2.问题分析
我们一步步的进行分析:
当n = 1时,青蛙的跳法就只有1种;
当n = 2时,青蛙的跳法就有2种;(青蛙跳1,1;青蛙跳2)
当n = 3时,青蛙的跳法就有3种;(青蛙跳1,1,1;青蛙跳1,2;青蛙跳2,1)
当n = 4时,青蛙的跳法就有5种;(青蛙跳1,1,1,1;青蛙跳2,2;青蛙跳1,2,1;青蛙跳2,1,1;青蛙跳1,1,2)
……
我们分析前三步,好像是存在这某种规律,到了第四步我们发现这种规律是不存在的。然后我们在分析一下n = 5的情况,我们可以分解成两步:
1.首先,我们假设青蛙跳一级台阶,那么,我们将这一级台阶作为下一次跳的起点,还剩下四级台阶,我们前面分析出,四级台阶的情况,有5种情况。
2.再假设青蛙跳两级台阶,那么,我们将这一级台阶作为下一次跳的起点,还剩下三级台阶,同理,三级台阶的情况,有3种情况。
综上所述,当n = 5时,我们有3 + 5 = 8种情况。所以,我们将问题又一次从大问题一步步分解成小问题。我们也是想到了递归算法以及动态规划的基本思想(用上一步的结果,来快速计算得到下一步的结果)。
3.问题总结
n = 1 : f(n) = 1;
n = 2 : f(n) = 2;
n > 2 : f(n) = f(n-1) + f(n-2)
4.代码实现
/* 青蛙跳台阶的问题 */
#include <stdio.h>
int fun(int n){
if(n <= 0){
return 0;
}
if(n == 1){
return 1;
}
if(n == 2){
return 2;
}
else{
return fun(n - 1) + fun(n - 2);
}
}
int main(){
int n = 0;
scanf("%d",&n);
int ret = fun(n);
printf("%d级台阶,青蛙有%d种跳法!",n,ret);
return 0;
}
结果与我们分析一致。