我提前道歉。我知道之前已经问过这个问题的答案没有产生我想要/需要的结果。我正在尝试编写一个在Python3中执行以下操作的函数:
我需要一个递归函数,它返回产生指定数量的所有方式(硬币组合)。此函数只能包含两个参数,金额和金币。我很难将自己的思维包裹在递归中,所以解释也会非常感激。谢谢。
以下是我目前的情况:
COINS = dict(
USA=[100, 50, 25, 10, 5, 1],
AUSTRALIA=[200, 100, 50, 20, 10, 5],
UK=[500, 200, 100, 50, 20, 10, 5, 2, 1]
)
def change(amount, coins):
"""
>>> change(100, COINS['USA'])
293
"""
if amount < 0:
return 0
elif amount == 0:
return 1
else:
biggestcoin, *rest = coins[0], coins[1:]
return change(amount-biggestcoin, coins) + change(amount, rest)
答案 0 :(得分:3)
biggestcoin, *rest = coins[0], coins[1:]
您希望此处rest
在逻辑上不是*rest
,因为每边都有两个项目。在这里使用*rest
会创建一个额外的列表包装层,然后会导致您可能看到的异常。
一旦你解决了这个问题:想想如果你不能用每枚硬币中的1枚赚取所需的金额会发生什么。 change(amount, rest)
递归调用最终会在amount
大于零且rest
为空时发生。你也需要处理这个案子。
答案 1 :(得分:1)
递归背后的想法很简单:
尝试并逐步缩小问题的大小。
如果你能做到这一点,你差不多完成了!从一个大问题开始,一点一点地继续减小尺寸,直到你最终遇到一个非常小的问题。你可以随心所欲地解决这个问题。
这如何适用于变更问题?好吧,如果你被要求制作n
,你只需要用一枚硬币就可以减少问题的大小。如果你继续前进,最终你会得到一个足够小的问题来解决!