JAVA 递归算法- 椰子汁5元一瓶,4个盖子可以换一瓶椰子汁,3个空瓶可以换一瓶椰子汁,那么 100 块钱可以喝多少瓶椰子汁,剩下瓶盖和空瓶各多少?

目录

原题展示

做表理思路

当初始汽水为3瓶时

当初始汽水为4瓶时

分析提取数据逻辑

瓶子的个数的计算

盖子的个数的计算

汽水数目的计算

取模运算

源代码

成功截图


原题展示

椰子汁5元一瓶,4个盖子可以换一瓶椰子汁,3个空瓶可以换一瓶椰子汁,那么 100 块钱可以喝多少瓶椰子汁,剩下瓶盖和空瓶各多少?

做表理思路

当初始汽水为3瓶时

瓶子

3

1

2

盖子

3

4

1

汽水

3

4

5

具体就是

瓶子

3

3/3+3%3+3/4=1

1/3+1%3+4/4=0+1+1=2

盖子

3

3/4+3%4+3/3=0+3+1=4

4/4+4%4+1/3=1+0+0=1

汽水

3

3+3/3+3/4=4

4+1/3+4/4=5

当初始汽水为4瓶时

瓶子

4

3

1

盖子

4

2

3

汽水

4

6

7

具体就是

瓶子

4

4/3+4%3+4/4=3

3/3+3%3+2/4=1

盖子

4

4/4+4%4+4/3=2

2/4+2%4+3/3=0+2+1=3

汽水

4

4+4/3+4/4=6

6+3/3+2/4=7

分析提取数据逻辑

相信经过上面4个表格的运算逻辑已经十分明显了!!

接下来我们将逻辑好好理理就可以写代码了,其中我们先算瓶子个数

瓶子的个数的计算

先用瓶子的当前数量除以3,再加上瓶子的当前数量模3,再加上盖子的当前数量除以4。

为什么要这样写呢?

很简单因为当瓶子数量改变的时候,盖子数量也会改变,所以才有了最后那一句盖子的数量除以4如果这个值大于1说明这又可以换水了,如果可以换水也就是说瓶子的数目也会再次改变了!

所以我们需要加上后面那一句这很重要!

再往前面分析一下,为什么要用当前瓶子的数目模3呢?

答案很简单为了算出当前瓶子在兑换汽水后我们还剩下的瓶子数目,因为这是一个动态变化的过程呀!

其实这边也可以写为当前的汽水数目去模我们的3,结果都是一样的!

再往前为什么要用瓶子数除以3呢?

相信这个都很好理解,就是算出当前瓶子的个数能够换取多少瓶汽水,。

OK总理一下逻辑。

瓶子的当前个数=瓶子能够换取的汽水个数+瓶子剩余的个数再+盖子能够换取汽水的数目。

            int tempcap=cap/4;
            int tempbottle=bottle/3;
            bottle=tempbottle+tempcap+drink%3;

由此上面的逻辑式子,就一目了然了

盖子的个数的计算

以此类推盖子的数目也可以算出来

            int tempcap=cap/4;
            int tempbottle=bottle/3;
            cap=tempcap+tempbottle+drink%4;

汽水数目的计算

最后就是当前汽水的数目这个更好理解

当前汽水的数目=原来汽水的数目+瓶子能够换取的汽水数目+盖子能换取的汽水数目

            int tempcap=cap/4;
            int tempbottle=bottle/3;
            drink=drink+tempcap+tempbottle;

取模运算

最后补充一点就是取模运算,请问2模3结果是多少?
答案是2,很多人以为答案是一这是一个易错点,容易自己把自己给搞糊涂

我们还是先写出平常数据

假如3/2,模是1;(减去2的倍数2,剩下1)
假如5/2,模是1;(减去2的倍数4,剩下1)
假如8/3,模是2; (减去3的倍数6,剩下2)

那么我们就可以总结出来,2%3的过程是(2减去3的0倍,剩下2)故答案是2

源代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args)
    {

        Scanner input=new Scanner(System.in);
        System.out.println("请输入价钱");
        int initsum=input.nextInt()/5;
        getDrink(initsum,initsum,initsum);
}

    public static int getDrink(int drink,int cap,int bottle)
    {
        if(cap<4&&bottle<3)
        {
            System.out.printf("结果是如下:\n剩余盖子:%d 剩余瓶子:%d 剩余汽水:%d\n",cap,bottle,drink);
            return 0;
        }
        else {
            int tempcap=cap/4;
            int tempbottle=bottle/3;
            cap=tempcap+tempbottle+cap%4;
            bottle=tempbottle+tempcap+bottle%3;
          //这样写也可以
          //cap=tempcap+tempbottle+drink%4;                            
          //bottle=tempbottle+tempcap+drink%3;

            drink=drink+tempcap+tempbottle;
            System.out.printf("当前盖子:%d 当前瓶子:%d 当前汽水:%d\n",cap,bottle,drink);

            return getDrink(drink,cap,bottle);
        }
    }

}

成功截图

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桂亭亭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值