问题描述:上楼梯,楼梯有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);
}
}