递归经典案例《买啤酒问题》

题目:啤酒2元一瓶,4个酒盖可以兑换1瓶啤酒,2个空瓶可以兑换1瓶酒,请问10元最终可以喝多少瓶酒,剩余多少个空瓶和盖子?

public class Test {
    // 定义此静态成员变量来存储最终喝的酒的总数量
    public static int totalNumber;
    // 定义两个静态成员变量分别记录最后剩下的空瓶数以及盖子数
    public static int lastBottleNumber;
    public static int lastCoverNumber;

    public static void main(String[] args) {
        // 1、调用方法拿钱买酒
        buy(10);
        System.out.println("喝酒总数:" + totalNumber + "瓶");
        System.out.println("剩下的盖子数:" + lastCoverNumber + "个");
        System.out.println("剩下的瓶子数:" + lastBottleNumber + "瓶");
    }

    public static void buy(int money) {
        // 2、第一次进来时的钱可以买多少瓶酒以及喝出来的空瓶子及盖子数量
        int buyNumber = money / 2;
        // 累加到最终喝的酒总个数
        totalNumber += buyNumber;
        // 3、将空瓶和盖子统计到这里,用来“换钱”
        int coverNumber = lastCoverNumber + buyNumber;
        int bottleNumber = lastBottleNumber + buyNumber;
        // 换来的瓶子和盖子都拿来换钱
        int allMoney = 0;
        if (coverNumber >= 4) {
            // 如果达到要求加入该分支换算成钱赋值回去
            allMoney += (coverNumber / 4) * 2;
        }
        // 换完钱也要将剩下的盖子数量换算出来
        lastCoverNumber = coverNumber % 4;
        // 4、瓶子同理用来换算
        if (bottleNumber >= 2) {
            allMoney += (bottleNumber / 2) * 2;
        }
        lastBottleNumber = bottleNumber % 2;
        // 5、最后如果换到的钱满足重新调用方法用换来的钱再换算,直到不满足结束递归
        if (allMoney >= 2) {
            buy(allMoney);
        }
    }
}

运行结果:

        喝酒总数:15瓶
        剩下的盖子数:3个
        剩下的瓶子数:1瓶

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值