算法:N级台阶,一步可走1或2阶,求全部的路线方案

问题描述:上楼梯,楼梯有N级台阶,可以一步走一级台阶,也可以一步走两级台阶,请问一共有多少种走法?这些走法分别是什么?

程序需要入参总台阶数totalStep,比如totalStep=3的时候,控制台输出如下结果:

第1种方案:1 -> 1 -> 1
第2种方案:1 -> 2
第3种方案:2 -> 1

totalStep=6的时候,控制台输出:

第1种方案:1 -> 1 -> 1 -> 1 -> 1 -> 1
第2种方案:1 -> 1 -> 1 -> 1 -> 2
第3种方案:1 -> 1 -> 1 -> 2 -> 1
第4种方案:1 -> 1 -> 2 -> 1 -> 1
第5种方案:1 -> 1 -> 2 -> 2
第6种方案:1 -> 2 -> 1 -> 1 -> 1
第7种方案:1 -> 2 -> 1 -> 2
第8种方案:1 -> 2 -> 2 -> 1
第9种方案:2 -> 1 -> 1 -> 1 -> 1
第10种方案:2 -> 1 -> 1 -> 2
第11种方案:2 -> 1 -> 2 -> 1
第12种方案:2 -> 2 -> 1 -> 1
第13种方案:2 -> 2 -> 2

totalStep=7的时候,控制台输出:

第1种方案:1 -> 1 -> 1 -> 1 -> 1 -> 1 -> 1
第2种方案:1 -> 1 -> 1 -> 1 -> 1 -> 2
第3种方案:1 -> 1 -> 1 -> 1 -> 2 -> 1
第4种方案:1 -> 1 -> 1 -> 2 -> 1 -> 1
第5种方案:1 -> 1 -> 1 -> 2 -> 2
第6种方案:1 -> 1 -> 2 -> 1 -> 1 -> 1
第7种方案:1 -> 1 -> 2 -> 1 -> 2
第8种方案:1 -> 1 -> 2 -> 2 -> 1
第9种方案:1 -> 2 -> 1 -> 1 -> 1 -> 1
第10种方案:1 -> 2 -> 1 -> 1 -> 2
第11种方案:1 -> 2 -> 1 -> 2 -> 1
第12种方案:1 -> 2 -> 2 -> 1 -> 1
第13种方案:1 -> 2 -> 2 -> 2
第14种方案:2 -> 1 -> 1 -> 1 -> 1 -> 1
第15种方案:2 -> 1 -> 1 -> 1 -> 2
第16种方案:2 -> 1 -> 1 -> 2 -> 1
第17种方案:2 -> 1 -> 2 -> 1 -> 1
第18种方案:2 -> 1 -> 2 -> 2
第19种方案:2 -> 2 -> 1 -> 1 -> 1
第20种方案:2 -> 2 -> 1 -> 2
第21种方案:2 -> 2 -> 2 -> 1

totalStep越大,则输出方案越多!以下是实现的代码,供参考:

/**
 * 楼梯有 totalStep 级台阶,可以一步走一级台阶,也可以一步走两级台阶,
 * 请问一共有多少种走法?这些走法分别是什么?
 * @Author: 李先森
 * @Date: 2019/7/14 20:21
 */
public class ClimbStairsPuzzle {

    //记录路线的编号
    private static int routeNo = 1;

    /**
     * 走台阶的方法
     * @param totalStep 总台阶数
     * @param currentStep 当前所处的台阶数
     * @param route 路线记录
     */
    private static void climbStairs(int totalStep, int currentStep, String route){
        //如果已经超过了总步数
        if (currentStep > totalStep){
            //方案失效,直接结束递归
            return;
        }

        //如果刚刚等于总步数
        if (currentStep == totalStep){
            //打印路线图
            System.out.println("第"+ routeNo + "种方案:" + route);

            //方案编号+1
            routeNo ++;

            //结束递归
            return;
        }

        //还没到总步数,递归尝试下步走一个台阶,同时记录路径
        climbStairs(totalStep, currentStep + 1, route + " -> " + 1);

        //递归尝试下步走两个台阶,同时记录路径
        climbStairs(totalStep, currentStep + 2, route + " -> " + 2);
    }

    /**
     * 走台阶的方法(重载方法,就调用这个方法)
     * @param totalStep
     */
    public static void climbStairs(int totalStep){
        //先将路线的编号初始化
        routeNo = 1;

        //初始走一步
        climbStairs(totalStep, 1, "1");

        //初始走两步
        climbStairs(totalStep, 2, "2");
    }

    /**
     * 调用走台阶的方法
     * @param args
     */
    public static void main(String[] args) {
        //调用方法,传入总台阶数,比如本例中的7
        climbStairs(7);
    }

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值