游戏简介
一只青蛙跳n个台阶,每次可以跳1个台阶,也可以跳2个台阶…也可以跳m个台阶,则有多少种跳法。
实例
情况1:
当m>n时,也就是每次可以跳的台阶数>总台阶数
情况2:
当m<n时,也就是每次可以跳的台阶<总台阶数
n | m | x |
---|---|---|
1 | 3 | 1 |
2 | 3 | 2 |
3 | 3 | 4 |
4 | 3 | 7 |
5 | 3 | 13 |
6 | 3 | 24 |
代码思路
当m>n时,就与 青蛙跳台阶扩展1 的结果一样
方法1:当m<n时,前m个台阶就是青蛙跳台阶扩展1,而最后这n-m个台阶就是一个特殊的斐波那契数列。
而这个斐波那契数列的第n项为前m项之和,如上表,为前3项之和。
或:
方法2:当m<n时,n阶时的次数就等于2*(n-1阶时的次数)-(n-m-1阶时的次数)。
(其实道理一样,如6阶=2*5阶-2阶,因为6 = 5+4+3 而5=4+3+2 所以6=(4+3+2)+4+3,比起两个5阶少了一个2阶,所以6=2*5阶-2阶)
代码
代码1:此代码时间复杂度较高
public class Test01 {
public static int jumpNum1(int n){
if (n==1){
return 1;
}
return 2*jumpNum1(n-1);
}
public static int jumpNum2(int n , int m){
if (m >= n){
return jumpNum1(n);
}else {
return jumpNum3(n,m);
}
}
public static int jumpNum3( int n , int m){
int sum = 0;
for (int i = 1; i <= m;i++) {
sum += jumpNum2(n-i,m);
}
return sum;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入台阶阶数:");
int n = sc.nextInt();
System.out.println("请输入每次最多跳几阶");
int m = sc.nextInt();
System.out.println(jumpNum2(n,m));
}
}
代码2:
public class Test01 {
public static int jumpNum1(int n){
if (n==1||n==0){
return 1;
}
return 2*jumpNum1(n-1);
}
public static int jumpNum2(int n , int m){
if (m >= n){
return jumpNum1(n);
}else {
return 2*jumpNum2(n-1,m)-jumpNum2(n-m-1,m);
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入台阶阶数:");
int n = sc.nextInt();
System.out.println("请输入每次最多跳几阶");
int m = sc.nextInt();
System.out.println(jumpNum2(n,m));
}
}
测试截图
代码1的测试截图
代码2的测试截图