鱼C论坛

 找回密码
 立即注册
查看: 1183|回复: 7

[已解决]小蠢鱼

[复制链接]
发表于 2018-1-27 16:50:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目:
一个人买汽水,一块钱一瓶汽水,三个瓶盖可以换一瓶汽水,两个空瓶可以换一瓶汽水
问20块钱可以买多少汽水?
注意:使用递归


  1. def drink(water,cup,bottle):
  2.     if cup < 3 and bottle < 2:
  3.         return water
  4.     else:
  5.         water += (cup//3 + bottle//2)
  6.         return drink(cup//3 + bottle//2,cup%3,bottle%2) + water

  7. print(drink(20,20,20))
  8.         
复制代码

我得出的结果是错的 应该是113,实在想不出来哪不对....

下面是我搜的一些相关的资料

首先分析每一个成员变量,
&#8226;        1drink=1cup+1bottle;
&#8226;        3cup=1drink;
&#8226;        2bottle=1drink;
**所以置换的过程就是cup-3,drink+1 或者bottle-2,drink+1的过程。
所以递归调用的条件就是每一轮置换后,cup>=3||bottle>=2, &&drinks<1也就是跳出递归的条件是:每一轮置换后cup<3&&bottle<2 &&drinks<1**
因为在这个过程中,三个元素drink, cup, bottle都有连续的变化,所以递归调用时要将三个参数都传就去。


最佳答案
2018-1-27 17:53:17
首先你需要把思路理清楚,既然你把汽水数,空瓶和盖都传入了参数里,汽水数肯定不能再参与后来的运算了(只能在返回时使用),不然就重复计算了。
所以在函数里你只需要关注传入的空瓶和瓶盖,当前的空瓶和盖新产生了多少瓶汽水,以及当前剩余的空瓶和盖是多少。
def get_bottle(bottle, cap, empty):
    if bottle < 1 and cap <3  and empty <2:
        return 0
    else:
        new_bottle = cap//3+empty//2
        new_cap = new_bottle+cap%3
        new_empty = new_bottle+empty%2
        return bottle+get_bottle(new_bottle, new_cap,new_empty)

print(get_bottle(20, 20, 20))

思维图

思维图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-27 17:44:25 | 显示全部楼层
  1. def drink(water,cup,bottle):
  2.     if cup < 3 and bottle < 2:
  3.         return water
  4.     else:
  5.         water += (cup//3 + bottle//2)
  6.         cup = cup%3 + (cup//3 + bottle//2)
  7. 你这样试试,但是结果是95,你确定答案是113?
  8.         bottle = bottle%2 + (cup//3 + bottle//2)
  9.         return drink(water,cup,bottle)

  10. print(drink(20,20,20))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-27 17:46:48 | 显示全部楼层

嗯 113,我先看看你的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-27 17:47:28 | 显示全部楼层

我检测了我这个是对的,可能你答案错了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-27 17:49:02 | 显示全部楼层

你的 第6行第8行什么意思,好像没道理啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-27 17:51:10 | 显示全部楼层
皮皮小发 发表于 2018-1-27 17:47
我检测了我这个是对的,可能你答案错了吧

http://blog.csdn.net/g626316/article/details/76290581
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-27 17:52:09 | 显示全部楼层
地主家的小颖哥 发表于 2018-1-27 17:49
你的 第6行第8行什么意思,好像没道理啊?

就是重新定义cup和bottle,因为你换来的也要算进去啊,第七行是乱入的,不好意思,还有你用二检测一下是对的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-27 17:53:17 | 显示全部楼层    本楼为最佳答案   
首先你需要把思路理清楚,既然你把汽水数,空瓶和盖都传入了参数里,汽水数肯定不能再参与后来的运算了(只能在返回时使用),不然就重复计算了。
所以在函数里你只需要关注传入的空瓶和瓶盖,当前的空瓶和盖新产生了多少瓶汽水,以及当前剩余的空瓶和盖是多少。
def get_bottle(bottle, cap, empty):
    if bottle < 1 and cap <3  and empty <2:
        return 0
    else:
        new_bottle = cap//3+empty//2
        new_cap = new_bottle+cap%3
        new_empty = new_bottle+empty%2
        return bottle+get_bottle(new_bottle, new_cap,new_empty)

print(get_bottle(20, 20, 20))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 08:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表