1.题目
从A点到B点有n阶楼梯,小明现在要从A点到B点,他可以一步迈一个格子,也可以一步迈两个格子,也可以一步迈三个格子,也可以一步迈四个格子。请编写程序计算小明从A点到B点一共有多少种走法。
2.分析:
我们要求一共有多少种解法,可以先从简单问题入手,贪心策略就是要着眼于局部,找到一个局部最优解法。
先假设:有n阶台阶,n=1,有一种走法
n=2,有两种走法
n=3,有4种走法,直接跨四阶、每次都跨一阶、先跨两阶,再跨一阶、先跨一阶,再跨两阶。
n=4,假设先不考虑这个问题,先以前面三种的情况编写代码。
代码片段,主体思想使用递归
if (n == 1 || n == 2){
//当n等于前两个台阶时,n是多少就有多少种方法
return n;
}
else if (n == 3){
return n + 1;
}
然后考虑问题的角度要变一下,我们在一开始对于台阶具体数量不甚清楚的,但是我们猜测最后台阶剩余的的情况,有可能是剩一阶,两阶,三阶,反正最后肯定是这几种情况,其他的阶数是可以通过这三种组合起来表示的,相当于这三个已经是原子操作了,递归的语句肯定就是这几句了。
要减去用掉的台阶数量,我们只要规定有哪几种会被减去的类型即可,具体被减去的操作交予代码实现,到此可以上机验证一下答案和手算的一致否。
public static long Jumpstairs(int n){
if (n == 1 || n == 2){
//当n等于前两个台阶时,n是多少就有多少种方法
return n;
}
else if (n == 3){
return n + 1;
}
else {
return Jumpstairs(n - 3) + Jumpstairs(n - 2) + Jumpstairs(n - 1);
}
}
很明显,思路是正确的,答案是正确的。然后再来加入一次可以走四阶这个条件。
原来不加走四阶这个条件时,台阶总数n=4的走法一共有7种,加上之后会变成8种。
上述原子操作也要加上四阶这个情况,根据上述简单的推理,然后得出下述实现代码,
public static long Jumpstairs(int n){
if (n == 1 || n == 2){
//当n等于前两个台阶时,n是多少就有多少种方法
return n;
}
else if (n == 3){
return n + 1;
}
else if (n == 4){
return n * 2;
}
else {
return Jumpstairs(n - 4) + Jumpstairs(n - 3) + Jumpstairs(n - 2) + Jumpstairs(n - 1);
}
}
3.主函数
import java.util.Scanner;
public class Main1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数据组数n:");
int n = scanner.nextInt();
while (n > 0){
n--;
int tmp;
tmp = scanner.nextInt();
System.out.println("爬上" + tmp + "阶楼梯有" + Jumpstairs(tmp) + "种方法");
}
}
链接题目
https://pintia.cn/problem-sets/1633634164392157184/exam/problems/1633634164459266049
链接仓库