每 3 个可乐盖可兑换 1 瓶子可乐,求买 100 瓶可乐最终可获得的可乐瓶子数。(Java递归练习)

 结果为149,我这里有两种方法。

第一种按照自己的理解去写的,容易理解,比较长。

第二种很短,是别人给我的,难以理解,但是又是对的。

如果你理解了第二种方法,可以交流一下。

方法一

/*
每 3 个可乐盖可兑换 1 瓶子可乐,求买 100 瓶可乐最终可获得的可乐瓶子数。(递归练习)
 */
public class RecursionDemo {
    /*
    瓶盖数 兑换数 剩余瓶盖数
    100 > 33    1
    34  > 11    1
    12  > 4     0
    4   > 1     1
    2   > 0     2
    最终瓶子数量=1+4+11+33+100=149
    用递归可以计算兑换获得的瓶子数量
    然后加上起始瓶子数量
     */

    /**
     * 每 3 个瓶盖可兑换 1 瓶可乐
     * 你买了多少瓶可乐呢,我可以帮你计算最终你可以喝到多少瓶可乐
     * @param bottles 你买的可乐瓶数
     * @return 你最终兑换得到的可乐瓶数
     */
    public static int countBottles(int bottles) {
        // 把这bottles瓶可乐喝了,可以获得bottles个瓶盖
        int lids = bottles;
        // 最终你能喝到的瓶数=刚刚喝掉的瓶数+用这些瓶盖最终能换来的瓶数
        return bottles + getCola(lids);
    }


    /**
     * 递归
     * 每三个瓶盖可以换一瓶饮料
     * @param lids 给多少个瓶盖
     * @return 返回值是你给的瓶盖所能换来的所有饮料瓶数
     */
    public static int getCola(int lids) {
        // 现在有lids个盖子
        // 判断瓶盖是否少于三个
        if (lids < 3) {
            // 瓶盖少于三个,不能兑换了
            return 0;
        } else {
            // 还能兑换,用lids个瓶盖兑换,那么可以换来lids/3瓶新可乐,剩下lids%3个瓶盖
            // 兑换可乐之后,旧的瓶盖数量
            int oldLids = lids % 3;
            // 兑换可乐之后,新可乐数量
            int newBottles = lids / 3;
            // 喝了新的可乐,新瓶盖数量
            int newLids = newBottles;
            // 当前瓶盖数量=旧的瓶盖数量+新的瓶盖数量
            lids = oldLids + newLids;
            // 能换来的总数量=这次兑换得到的新瓶子数量+当前瓶盖数量可以换来的瓶子数量
            int res = newBottles + getCola(lids);
            return res;
        }
    }

    public static void main(String[] args) {
        System.out.println(countBottles(100));
    }
}

方法二

public class ColaDemo {
    public static void main(String[] args) {
        System.out.println(cola(100));
    }
    public static int cola(int num) {
        if (num < 3) {
            return num;
        }
        int i = num / 3;
        int j = num % 3;
        return num - j + cola(i + j);
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值