动态规划--台阶问题

有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶。要求用程序来求出一共有多少种走法。

 

如果每次走1级,需要走10步,结果可以表示成(1,1,1,1,1,1,1,1,1,1);

如果每次走2级,需要走5步,结果可以表示成(2,2,2,2,2,);

思考一下,你还能写出几种……

那么,共有多少种走法呢?

 

我们可以这样想,假设我们现在还有最后一步要走,可能的情况有哪些?

1.我们站在第9级上,一步1级后到达顶端;

2.我们站在第8级上,一步2级后到达顶端;

所以,最后一步可以走1级或者2级,不外乎两种情况。

 

再假设,已知从0级到9级的走法有M种,从0级到8级的走法有N种,那么思考一下,从0到10级的走法和M、N有什么关系呢?从0到10级的走法一共是多少种呢?答案是M+N。

 

也就是说,用F(n)来表示从0级到n级的走法,可得出

F(9)=M;

F(8)=N;

F(10)=M+N;

F(10)=F(9)+F(8);

 

如果已知从0到9级的走法和从0到8级的走法,问题就有答案了,那从0级到9级的走法有多少种呢?

 

我们依然这样想,还有一步就到9级,可能的情况有两种,从8到9和从7到9,已知了从0级到8级的走法有N种,如果再知道从0到7的走法有P种,那么从0到9级的走法就是N+P,那么可得出

F(8)=N;

F(7)=P;

F(9)=N+P;

F(9)=F(8)+F(7);

 

把一个复杂的问题,逐步简化成简单的问题,我们继续推断,当只剩下2级台阶和1级台阶时的走法分别是2和1。不难归纳出:

F(1)=1;

F(2)=2;

F(n)=F(n-1)+F(n-2);(n>=3)

 

这是一个递归,有了公式和递归结束条件,就可以写出程序了。

 

方法一:递归

  
 

public int getResultByRecursion(int n){
        if (n <1) {
            return 0;
        }
        if (n == 1){
            return 1;
        }
        if (n == 2){
            return 2;
        }
        return getResultByRecursion(n-1) + getResultByRecursion(n-2);
    }

https://blog.csdn.net/zhuanzhe117/article/details/72846939  转载链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值