[英]How to recursively write any large amount as a sum of 5 and 7 coins?
我正在上一门离散数学课程,但我不知道如何在 Python 中制作递归 function ,它可以将任何大量的金额转换为 5 枚和 7 枚硬币的总和。
我用 3- 和 5- 硬币尝试过它,它正在工作,但对于 5- 和 7- 它没有,我没有找到关于它的东西,比如规则或其他东西。
def change(amount) :
assert( amount>= 12 )
if amount==12 :
return [5,7]
if amount==14 :
return [7,7]
if amount==15:
return [5,5,5]
coins=change(amount-7)
coins.append(7)
return coins
我希望使用的硬币是 output,但它不起作用,当我发送它时它会显示“运行时错误”。
问题不是这里的python代码,而是算法。 如评论中所述,始终首先删除 7 可以在无限递归的情况下引导您。
如果“数量”足够大(我猜高于 35 个作品,但您可能需要进行数学运算以找到确切的限制),您可以这样进行:
def change(amount):
if (amount % 5 == 0):
return [5] * int(amount/5)
elif (amount % 7 == 0):
return [7] * int(amount/7)
else:
coins = change(amount-5)
return coins.append(5)
这适用于足够大的值,因为在最多 7 次删除 5 之后,您将始终得到一个 7 的倍数的结果。
应该有更聪明的方法来做到这一点,但它应该有效。
知道最小值 23,另一种方法(非递归)是查看模 5 除法( amount % 5
),并给出 5 个不同的解决方案。
如果是0, amount
可以除以5,所以只是一个5s的列表; 如果是1,去掉3*7 = 21,剩下的是5s的列表; 等等。 以下代码为您提供了所有大于 23 amount
正确答案。然后,您只需处理剩余的情况(如有必要)。
def change(amount):
d = amount % 5
if d == 0:
return [5] * int(amount/5)
elif d == 1:
return [7] * 3 + [5] * int((amount-21)/5)
elif d == 2:
return [7] + [5] * int((amount-7)/5)
elif d == 3:
return [7] * 4 + [5] * int((amount-28)/5)
elif d == 4:
return [7] * 2 + [5] * int((amount-14)/5)
只是为了好玩,它可能会帮助您查看实际上是递归的更改程序。
# amount paid and cost due in dollars.
def process(paid,cost):
amount = int((float(paid)-float(cost))*100)
names = ['penny','nickle','dime','quarter','halfdollar','dollar','2Piece','5Spot','Tenner','Dub','Fifty','CNote']
made = {k:0 for k in names}
return(makeChange(amount,made))
def makeChange(amount,made):
# coin and bill values in cents
coins = [1,5,10,25,50,100,200,500,1000,2000,5000,10000]
coins.reverse()
names = ['penny','nickle','dime','quarter','halfdollar','dollar','2Piece','5Spot','Tenner','Dub','Fifty','CNote']
names.reverse()
decode = {coins[n]:names[n] for n,k in enumerate(coins)}
i = 0
if(amount>0):
while(coins[i]>amount):
i+=1
amount-=coins[i]
made[decode[coins[i]]]+=1
else:
return(made)
return(makeChange(amount,made))
test = process(20,11.73)
for k in test:
if(test[k]!=0):
print(k+":"+str(test[k]))
由于 24、25、26、27、28 都可以用 5 和 7 表示,我们可以创建一个算法,在每次递归调用期间将数量减少 5。 最后,递归将实现 if else 语句中列出的基本条件之一。 代码如下所示
def change(amount):
if amount == 24:
return [5, 5, 7, 7]
if amount == 25:
return [5, 5, 5, 5, 5]
if amount == 26:
return [7, 7, 7, 5]
if amount == 27:
return [5, 5, 5, 5, 7]
if amount == 28:
return [7, 7, 7, 7]
coins = change(amount-5)
coins.append(5)
return coins
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.