递归查找产生指定金额的所有硬币组合

时间:2012-03-22 01:01:56

标签: python recursion python-3.x coin-change

我提前道歉。我知道之前已经问过这个问题的答案没有产生我想要/需要的结果。我正在尝试编写一个在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)

2 个答案:

答案 0 :(得分:3)

biggestcoin, *rest = coins[0], coins[1:]

您希望此处rest在逻辑上不是*rest,因为每边都有两个项目。在这里使用*rest会创建一个额外的列表包装层,然后会导致您可能看到的异常。

一旦你解决了这个问题:想想如果你不能用每枚硬币中的1枚赚取所需的金额会发生什么。 change(amount, rest)递归调用最终会在amount大于零且rest为空时发生。你也需要处理这个案子。

答案 1 :(得分:1)

递归背后的想法很简单:

  

尝试并逐步缩小问题的大小。

如果你能做到这一点,你差不多完成了!从一个大问题开始,一点一点地继续减小尺寸,直到你最终遇到一个非常小的问题。你可以随心所欲地解决这个问题。


这如何适用于变更问题?好吧,如果你被要求制作n,你只需要用一枚硬币就可以减少问题的大小。如果你继续前进,最终你会得到一个足够小的问题来解决!