繁体   English   中英

如何递归地将任何大的金额写为 5 和 7 个硬币的总和?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM