变态版青蛙跳台阶扩展

游戏简介

一只青蛙跳n个台阶,每次可以跳1个台阶,也可以跳2个台阶…也可以跳m个台阶,则有多少种跳法。

实例

情况1:
当m>n时,也就是每次可以跳的台阶数>总台阶数
情况2:
当m<n时,也就是每次可以跳的台阶<总台阶数

nmx
131
232
334
437
5313
6324

代码思路

当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的测试截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值