经典算法----青蛙跳台阶问题(斐波那契数列)——动态规划基本思想

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;
}

结果与我们分析一致。

       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值