问题描述:

这是经典的递归问题,但是这个递归算法新加了条件会稍微难一点。
1、可以问店家借酒
2、喝到手里没有瓶子和瓶盖为止

问题不是很难,但如果不打草稿直接码会有一定难度。
注意事项:
1、编写代码过程中一定注意 capnum 、 bottlenum 、drinknum 三者变量的关系。
2、借酒时注意借后是否要喝,也就决定了手里的盖子数和瓶子数是否增加
3、递归结束条件的确定:瓶子数和盖子数为0
4、瓶子数和盖子数如何才能为0?

  • 首先喝了酒手里的盖子数和瓶子数一定会增加,所以最后一次一定不是喝酒,而是还酒
  • 其次最后不可能是还一瓶,为什么?因为没有瓶子数和盖子数搭配换酒的方案。那还多少瓶呢?这个就涉及到公倍数的问题,最终还酒的数量一定是 2瓶
  • 为什么是2瓶呢?4个盖子一瓶啤酒,2个瓶子一瓶啤酒;2和4的公倍数恰好是4,所以这两瓶酒一瓶是瓶子换来的,一瓶是盖子换来的。至于为啥是这样呢,这是在我跑了很多次debug和经历了很多次栈溢出…推出来的…其实这道题也很好的印证了所有算法都是可以用数学来解决的本质。

—————————————————————————
最后得出一个小结论:按照这个规则,最终能喝到啤酒的数量是:一开始购买啤酒数量的4倍
至于兑换规则与喝酒数量三个变量之间的关系…emmm找个时间码一下。
如果文中所述与代码有任何问题,欢迎大家指出相互交流哦~

package test;public class Drink {public static void main(String[] args) {int drink = BuyBottle(10);test(drink, drink, drink);}/*** @param capnum 手里盖子数量* @param bottlenum 手里瓶子数量* @param drinknum 已经打开并喝掉的啤酒数量* 一、分析:*  1、每瓶饮料2元 *  2、4个瓶盖一瓶饮料 *  3、2个瓶子一瓶饮料*  *  二、思路:*  算法核心:递归*  递归结束条件:手里没有瓶子、瓶盖并且与买酒老板互不赊欠 即: capnum==0&&bottlenum==0  */public static void test(int capnum, int bottlenum, int drinknum) {int Capnum = capnum;int Bottlenum = bottlenum;int Drinknum = 0;Drinknum = Drinknum + drinknum;while (Capnum >= 4 || Bottlenum >= 2) {if (Capnum >= 4) {// 瓶盖数量大于等于4int tempcap = 0;// 换酒tempcap = Capnum / 4;// 可以喝的数增加Drinknum = Drinknum + tempcap;// 瓶盖数减少// 得到酒后瓶盖增加Capnum = Capnum % 4 + tempcap;// 得到酒后酒瓶数也要增加Bottlenum = Bottlenum + tempcap;}if (Bottlenum >= 2) {// 瓶盖数量大于等于2就可以执行int tempbottle = 0;// 换酒tempbottle = Bottlenum / 2;// 可以喝的数增加Drinknum = Drinknum + tempbottle;// 瓶子数减少// 得到酒后酒瓶子数增加Bottlenum = Bottlenum % 2 + tempbottle;// 得到水后盖子数也要增加Capnum = Capnum + tempbottle;}}//如果手里瓶盖和瓶子数都为0,则结束if (Capnum == 0 && Bottlenum == 0) {System.out.println("最多喝"+Drinknum+"杯啤酒");} else {int lend = 0;int tempc=Capnum;int tempb=Bottlenum;while (tempc < 4 && tempb < 2) {lend++;tempc++;tempb++;}if(lend==1){//如果只借了1瓶,那么需要喝掉并兑换还回去Drinknum++;//喝掉Capnum++;//瓶盖数增加Bottlenum++;//瓶子数增加if(Capnum>=4){//如果瓶盖够,则换瓶盖Capnum-=4;if(lend>0){//还啤酒lend--;}else{//喝掉Drinknum++;Capnum++;Bottlenum++;}} if(Bottlenum>=2){//瓶子够就换瓶子Bottlenum-=2;if(lend>0){//还啤酒lend--;}else{//喝掉Drinknum++;Capnum++;Bottlenum++;}}test(Capnum, Bottlenum, Drinknum);//递归}else if (lend==2) {//若果借的饮料等于2瓶//喝掉Drinknum+=2;Bottlenum+=2;Capnum+=2;if(lend==(Capnum/4)+(Bottlenum/2)){//如果手里能兑换的数目和借的一样多Capnum=0;Bottlenum=0;lend-=2;}test(Capnum, Bottlenum, Drinknum);//递归}}}/*** 手里的钱起始购买饮料瓶数的方法* * @param money*            拥有的money* @return 返回的数据就是购买的瓶数*/public static int BuyBottle(int money1) {int price = 2;// 每瓶饮料2元int buydrink = 0;if (money1 >= 2) {buydrink = money1 / price;return buydrink;} else {return 0;}}
}

运行结果如下:

10元买啤酒问题Java递归相关推荐

  1. 【原创】10元买啤酒2个空瓶换一瓶4个瓶盖换一瓶经典算法

    转载请注明出处:http://blog.csdn.net/li396864285/article/details/51519786 [原创]10元买啤酒2个空瓶换一瓶4个瓶盖换一瓶,经典算法原题目:1 ...

  2. IBM面试:8元买鸡9元卖10元买回11元卖能挣几元?

    这两天在网络上看到,IBM有一道经典面试题:8元钱买一只鸡,9块钱卖出,后悔了,又以10元买回来,再以11元卖出去,问最后赚了多少钱? 这道题,在美国本土面试,世界上最聪明的印度人.犹太人都答不对.有 ...

  3. 卡特兰数:2N个人排队买电影票,N个人持5元买票,N个人持10元买票.售票处在售票前只有票没有钱,票价5元 ,问有多少种排队方式 能让2N个人顺利买票,并且输出所有排队队列(不会因为找钱问题)

    分析 n = 0 时,队列为空,可以认为只有一种: n = 1 时,队列:5 ,10  共有1种: n = 2 时 ,队列: 5, 10,5,10 5,5,10,10   共有两种 n = 3时, 队 ...

  4. 10元喝啤酒数学题 c语言,《C语言程序设计》试卷3

    <C语言程序设计>试卷三 姓名:班级:学号: 一.单项选择题(每小题1分,共30分) 1.以下叙述正确的是() ①在C程序中,main函数必须位于程序的最前面②C程序的每行中只能写一条语句 ...

  5. JAVA2块钱瓶子_啤酒2元一瓶,4个瓶盖换一瓶,2个空瓶换一瓶,问:10元钱可以喝几瓶。用java编程解出答案,求大神们帮忙...

    点击查看啤酒2元一瓶,4个瓶盖换一瓶,2个空瓶换一瓶,问:10元钱可以喝几瓶.用java编程解出答案,求大神们帮忙具体信息 答:package test;public class Test {publ ...

  6. java递归解决百元百鸡_JS计算输出100元钱买100只鸡问题的解决方法

    本文实例讲述了JS计算输出100元钱买100只鸡问题的方法.分享给大家供大家参考,具体如下: 问题: 公鸡5元一只,母鸡3元一只,小鸡1元买三只,我现在有100元钱要买100只鸡,问怎么买? 解决方法 ...

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

    题目:啤酒2元一瓶,4个酒盖可以兑换1瓶啤酒,2个空瓶可以兑换1瓶酒,请问10元最终可以喝多少瓶酒,剩余多少个空瓶和盖子? public class Test {// 定义此静态成员变量来存储最终喝的 ...

  8. * 3.喝啤酒问题,一瓶啤酒2元,两个空瓶子可以换一瓶啤酒,四个啤酒盖可以换一瓶啤酒,请问10元共可以喝多少瓶?

    package dh12_1111.IO.FIB;/*** @Description TODO* @Author 湖大知行李国勇* @Date 2022/11/11 10:07* 3.喝啤酒问题,一瓶 ...

  9. 每瓶啤酒2元,2个空酒瓶或4个瓶盖可换1瓶啤酒。10元最多可喝多少瓶啤酒?

    <?echo "每瓶啤酒2元,2个空酒瓶或4个瓶盖可换1瓶啤酒.n元最多可喝多少瓶啤酒?<br/>";for ($i=0; $i<=100 ; $i++) ...

最新文章

  1. 判断远程文件是否存在
  2. oracle变态错误解决:ORA-00604: 递归 SQL 级别 2 出现错误
  3. 大工18秋计算机应用在线作业,大工18秋《计算机组网技术》在线测试1【标准答案】...
  4. boost::coroutine模块实现非对称协程的测试程序
  5. OpenGL:使用FBO为渲染对象并从GPU取出存图
  6. 阿里云 EMAS HTTPDNS 联合函数计算重磅推出 SDNS 服务,三大能力获得突破
  7. java开始到熟悉60
  8. RS纠删码性能分析实战
  9. 如何在百度收录平台注册账号获取Token
  10. 计算机专业题库,计算机专业综合练习题库(附答案)
  11. 微信消息自动回复并汇总
  12. Could not find class 'android.graphics.drawable.RippleDrawable', referenced from method android.supp
  13. linux学习-执行cp命令时略过目录
  14. Premiere Pro CS4\CS5\CS6\CC2015\CC2017\CC2018\CC2019软件安装教程
  15. ECshop生成网站地图url
  16. CleanMyMac X4.20最新mac电脑优化工具好用吗?
  17. 【ChatBot开发笔记】聊天机器人准备工作——初识NLTK库、语料与词汇资源
  18. STM32/GD32 Bootloader升级APP研究以及编程实现
  19. SEOer未来发展的两个方向
  20. Android 四大组件之 Service_5_拦截电话号码

热门文章

  1. 【python】win10 安装 IPython
  2. Windows系统时间 FILETIME和SYSTEMTIME
  3. Android 重启
  4. Oracle数据连接时出现ORA-01034: ORACLE not available ORA-27101错误
  5. webx mysql_idea使用Maven启动maven项目、 webx框架项目
  6. 小米 13/13 Pro / MIX 4 手机可开通数字人民币硬钱包
  7. java mkfifo_pipe/popen/mkfifo
  8. 腾讯文档体验报告|“我”不是石墨
  9. Latex公式换行编写
  10. Linux——悟空crm9项目环境搭建