|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
题目:
一个人买汽水,一块钱一瓶汽水,三个瓶盖可以换一瓶汽水,两个空瓶可以换一瓶汽水
问20块钱可以买多少汽水?
注意:使用递归
- def drink(water,cup,bottle):
- if cup < 3 and bottle < 2:
- return water
- else:
- water += (cup//3 + bottle//2)
- return drink(cup//3 + bottle//2,cup%3,bottle%2) + water
- print(drink(20,20,20))
-
复制代码
我得出的结果是错的 应该是113,实在想不出来哪不对....
下面是我搜的一些相关的资料
首先分析每一个成员变量,
• 1drink=1cup+1bottle;
• 3cup=1drink;
• 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都有连续的变化,所以递归调用时要将三个参数都传就去。
首先你需要把思路理清楚,既然你把汽水数,空瓶和盖都传入了参数里,汽水数肯定不能再参与后来的运算了(只能在返回时使用),不然就重复计算了。
所以在函数里你只需要关注传入的空瓶和瓶盖,当前的空瓶和盖新产生了多少瓶汽水,以及当前剩余的空瓶和盖是多少。
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))
|
-
思维图
|