10元买啤酒问题Java递归
问题描述:
这是经典的递归问题,但是这个递归算法新加了条件会稍微难一点。
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递归相关推荐
- 【原创】10元买啤酒2个空瓶换一瓶4个瓶盖换一瓶经典算法
转载请注明出处:http://blog.csdn.net/li396864285/article/details/51519786 [原创]10元买啤酒2个空瓶换一瓶4个瓶盖换一瓶,经典算法原题目:1 ...
- IBM面试:8元买鸡9元卖10元买回11元卖能挣几元?
这两天在网络上看到,IBM有一道经典面试题:8元钱买一只鸡,9块钱卖出,后悔了,又以10元买回来,再以11元卖出去,问最后赚了多少钱? 这道题,在美国本土面试,世界上最聪明的印度人.犹太人都答不对.有 ...
- 卡特兰数: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时, 队 ...
- 10元喝啤酒数学题 c语言,《C语言程序设计》试卷3
<C语言程序设计>试卷三 姓名:班级:学号: 一.单项选择题(每小题1分,共30分) 1.以下叙述正确的是() ①在C程序中,main函数必须位于程序的最前面②C程序的每行中只能写一条语句 ...
- JAVA2块钱瓶子_啤酒2元一瓶,4个瓶盖换一瓶,2个空瓶换一瓶,问:10元钱可以喝几瓶。用java编程解出答案,求大神们帮忙...
点击查看啤酒2元一瓶,4个瓶盖换一瓶,2个空瓶换一瓶,问:10元钱可以喝几瓶.用java编程解出答案,求大神们帮忙具体信息 答:package test;public class Test {publ ...
- java递归解决百元百鸡_JS计算输出100元钱买100只鸡问题的解决方法
本文实例讲述了JS计算输出100元钱买100只鸡问题的方法.分享给大家供大家参考,具体如下: 问题: 公鸡5元一只,母鸡3元一只,小鸡1元买三只,我现在有100元钱要买100只鸡,问怎么买? 解决方法 ...
- 递归经典案例《买啤酒问题》
题目:啤酒2元一瓶,4个酒盖可以兑换1瓶啤酒,2个空瓶可以兑换1瓶酒,请问10元最终可以喝多少瓶酒,剩余多少个空瓶和盖子? public class Test {// 定义此静态成员变量来存储最终喝的 ...
- * 3.喝啤酒问题,一瓶啤酒2元,两个空瓶子可以换一瓶啤酒,四个啤酒盖可以换一瓶啤酒,请问10元共可以喝多少瓶?
package dh12_1111.IO.FIB;/*** @Description TODO* @Author 湖大知行李国勇* @Date 2022/11/11 10:07* 3.喝啤酒问题,一瓶 ...
- 每瓶啤酒2元,2个空酒瓶或4个瓶盖可换1瓶啤酒。10元最多可喝多少瓶啤酒?
<?echo "每瓶啤酒2元,2个空酒瓶或4个瓶盖可换1瓶啤酒.n元最多可喝多少瓶啤酒?<br/>";for ($i=0; $i<=100 ; $i++) ...
最新文章
- 判断远程文件是否存在
- oracle变态错误解决:ORA-00604: 递归 SQL 级别 2 出现错误
- 大工18秋计算机应用在线作业,大工18秋《计算机组网技术》在线测试1【标准答案】...
- boost::coroutine模块实现非对称协程的测试程序
- OpenGL:使用FBO为渲染对象并从GPU取出存图
- 阿里云 EMAS HTTPDNS 联合函数计算重磅推出 SDNS 服务,三大能力获得突破
- java开始到熟悉60
- RS纠删码性能分析实战
- 如何在百度收录平台注册账号获取Token
- 计算机专业题库,计算机专业综合练习题库(附答案)
- 微信消息自动回复并汇总
- Could not find class 'android.graphics.drawable.RippleDrawable', referenced from method android.supp
- linux学习-执行cp命令时略过目录
- Premiere Pro CS4\CS5\CS6\CC2015\CC2017\CC2018\CC2019软件安装教程
- ECshop生成网站地图url
- CleanMyMac X4.20最新mac电脑优化工具好用吗?
- 【ChatBot开发笔记】聊天机器人准备工作——初识NLTK库、语料与词汇资源
- STM32/GD32 Bootloader升级APP研究以及编程实现
- SEOer未来发展的两个方向
- Android 四大组件之 Service_5_拦截电话号码
热门文章
- 【python】win10 安装 IPython
- Windows系统时间 FILETIME和SYSTEMTIME
- Android 重启
- Oracle数据连接时出现ORA-01034: ORACLE not available ORA-27101错误
- webx mysql_idea使用Maven启动maven项目、 webx框架项目
- 小米 13/13 Pro / MIX 4 手机可开通数字人民币硬钱包
- java mkfifo_pipe/popen/mkfifo
- 腾讯文档体验报告|“我”不是石墨
- Latex公式换行编写
- Linux——悟空crm9项目环境搭建