简洁'how many beers'的问题?
The concise 'how many beers' issue?
我在哪里
我想知道在回收每一瓶啤酒后,我可以用 10 元购买多少啤酒。对我来说很明显,我在程序上做错了什么,但我没有想到那是什么。我目前正在阅读第 9 章的“How To Think Like a Computer Scientist: Think Python”。我觉得这对我来说应该是一个简单的程序,但我不确定如何在应用程序的回收部分循环。冲洗和重复购买啤酒的最简洁方法是什么?
问题
基本上一瓶啤酒2块钱。 2箱1元。 4瓶盖1元。我从 10 元起步。我可以购买多少啤酒(回收所有的垃圾桶和瓶盖)?
#5 bottles 5 caps
#= 3 rmb + 1 caps 1 bottles
#6th bottle bought
#= 2rmb + 2 caps
#7th bottle bought
#= 0rmb + 3 caps 1 bottles.
import math
def countbeers(rmb):
beers = 0;
caps = 0;
bins = 0;
bcost = 2;
for i in range (0,rmb):
beers += 1/2
for i in range (0,math.floor(beers)):
caps += 1
bins += 1
rmb = rmb - bcost
for i in range (0,caps):
rmb += 1/4
for i in range (0,bins):
rmb += 1/2
# if rmb > 2 what goes here, trying to loop back through
return beers
print(countbeers(10))
第二次尝试
#5 bottles 5 caps
#= 3 wallet + 1 caps 1 bottles
#6th bottle bought
#= 2wallet + 2 caps
#7th bottle bought
#= 0wallet + 3 caps 1 bottles.
import math
global beers
global caps
global bins
global bcost
beers = 0
caps = 0
bins = 0
bcost = 2
def buybeers(wallet):
beers = 0
for i in range (0,wallet):
beers += 1/2
wallet -= 2
return beers
def drinkbeers(beers):
for i in range (0,math.floor(beers)):
caps += 1
bins += 1
wallet = wallet - bcost
return wallet, caps, bins
def recycle(caps, bins):
for i in range (0,caps):
wallet += 1/4
for i in range (0,bins):
wallet += 1/2
return wallet
def maxbeers(wallet):
if wallet > 2:
buybeers(wallet)
if math.floor(beers) > 1:
drinkbeers(beers)
if caps > 4 | bins > 2:
recycle(caps, bins)
return wallet
wallet = int(input("How many wallet do you have?"))
maxbeers(wallet)
if wallet >= 2:
maxbeers(wallet)
elif wallet < 2:
print(beers)
你的主要问题是你没有循环。您从 rmb
购买的每一瓶啤酒都会多赠送一瓶和一瓶盖。这个新瓶子和盖子可能足以让您再赚一瓶 rmb
,这可能足够您再喝一瓶啤酒。你的实现在有限的范围内处理这个问题,因为你多次调用 maxbeers,但如果你给它一卡车啤酒,它不会给出正确的答案,即 25656 bottles.
如果你知道你有rmb
个数,你可以在纸上手算并写下:
def maxbeers(rmb):
return 7 # totally correct, I promise. Checked this by hand.
但这一点都不好玩。如果 rmb
是 25656
怎么办?
假设我们可以交换:
2 bottles -> 1 rmb
4 caps -> 1 rmb
2 rmb -> 1 beer + 1 cap + 1 bottle
我们这样计算,通过模拟:
def q(rmb):
beers = 0
caps = 0
bottles = 0
while rmb > 0:
# buy a beer with rmb
rmb -= 2
beers += 1
caps += 1
bottles += 1
# exchange all caps for rmb
while caps >= 4:
rmb += 1
caps -= 4
# exchange all bottles for rmb
while bottles >= 2:
rmb += 1
bottles -= 2
return beers
for a in range(20):
print("rmb:", a, "beers:", q(a))
那么我们可以买20525瓶啤酒。
我在哪里
我想知道在回收每一瓶啤酒后,我可以用 10 元购买多少啤酒。对我来说很明显,我在程序上做错了什么,但我没有想到那是什么。我目前正在阅读第 9 章的“How To Think Like a Computer Scientist: Think Python”。我觉得这对我来说应该是一个简单的程序,但我不确定如何在应用程序的回收部分循环。冲洗和重复购买啤酒的最简洁方法是什么?
问题
基本上一瓶啤酒2块钱。 2箱1元。 4瓶盖1元。我从 10 元起步。我可以购买多少啤酒(回收所有的垃圾桶和瓶盖)?
#5 bottles 5 caps
#= 3 rmb + 1 caps 1 bottles
#6th bottle bought
#= 2rmb + 2 caps
#7th bottle bought
#= 0rmb + 3 caps 1 bottles.
import math
def countbeers(rmb):
beers = 0;
caps = 0;
bins = 0;
bcost = 2;
for i in range (0,rmb):
beers += 1/2
for i in range (0,math.floor(beers)):
caps += 1
bins += 1
rmb = rmb - bcost
for i in range (0,caps):
rmb += 1/4
for i in range (0,bins):
rmb += 1/2
# if rmb > 2 what goes here, trying to loop back through
return beers
print(countbeers(10))
第二次尝试
#5 bottles 5 caps
#= 3 wallet + 1 caps 1 bottles
#6th bottle bought
#= 2wallet + 2 caps
#7th bottle bought
#= 0wallet + 3 caps 1 bottles.
import math
global beers
global caps
global bins
global bcost
beers = 0
caps = 0
bins = 0
bcost = 2
def buybeers(wallet):
beers = 0
for i in range (0,wallet):
beers += 1/2
wallet -= 2
return beers
def drinkbeers(beers):
for i in range (0,math.floor(beers)):
caps += 1
bins += 1
wallet = wallet - bcost
return wallet, caps, bins
def recycle(caps, bins):
for i in range (0,caps):
wallet += 1/4
for i in range (0,bins):
wallet += 1/2
return wallet
def maxbeers(wallet):
if wallet > 2:
buybeers(wallet)
if math.floor(beers) > 1:
drinkbeers(beers)
if caps > 4 | bins > 2:
recycle(caps, bins)
return wallet
wallet = int(input("How many wallet do you have?"))
maxbeers(wallet)
if wallet >= 2:
maxbeers(wallet)
elif wallet < 2:
print(beers)
你的主要问题是你没有循环。您从 rmb
购买的每一瓶啤酒都会多赠送一瓶和一瓶盖。这个新瓶子和盖子可能足以让您再赚一瓶 rmb
,这可能足够您再喝一瓶啤酒。你的实现在有限的范围内处理这个问题,因为你多次调用 maxbeers,但如果你给它一卡车啤酒,它不会给出正确的答案,即 25656 bottles.
如果你知道你有rmb
个数,你可以在纸上手算并写下:
def maxbeers(rmb):
return 7 # totally correct, I promise. Checked this by hand.
但这一点都不好玩。如果 rmb
是 25656
怎么办?
假设我们可以交换:
2 bottles -> 1 rmb
4 caps -> 1 rmb
2 rmb -> 1 beer + 1 cap + 1 bottle
我们这样计算,通过模拟:
def q(rmb):
beers = 0
caps = 0
bottles = 0
while rmb > 0:
# buy a beer with rmb
rmb -= 2
beers += 1
caps += 1
bottles += 1
# exchange all caps for rmb
while caps >= 4:
rmb += 1
caps -= 4
# exchange all bottles for rmb
while bottles >= 2:
rmb += 1
bottles -= 2
return beers
for a in range(20):
print("rmb:", a, "beers:", q(a))
那么我们可以买20525瓶啤酒。