0

我需要一些帮助,因为我觉得我迷路了。我以前在这个网站上搜索过,当然我也用谷歌搜索过,但相信我,如果它对我来说这么简单,我根本就没有问过,所以请善待我。我是 python 新手,编码对我来说并不容易。

无论如何,看看我的代码:

def coin_problem(price, cash_coins):
    if (price < 0):
        return []
    if (price == 0):
        return [[]]

    options = []

    for a_coin in cash_coins:
        coins_minus_coin = cash_coins[:]
        coins_minus_coin.remove(a_coin)
        sub_coin_problem = coin_problem (price - a_coin, cash_coins)
        for coin in sub_coin_problem:
            coin.append(a_coin)
        options.extend(sub_coin_problem)

    return options

print coin_problem(4, [1, 2])

正如你所看到的,我试图通过递归来处理著名的硬币问题(正如我之前写的,我知道很多人已经问过这个问题,我阅读了他们的问题和答案,但我仍然无法完全理解解决方案)。

这段代码是我写的,全部都是。现在我陷入困境和困惑。当“price”的值为 4 且“cash_coins”的值为 [1,2] 而不是返回如下内容时:

[1,1,1,1]
[2,2]
[2,1,1]

我得到的东西更像:

[[1, 1, 1, 1], [2, 1, 1], [1, 2, 1], [1, 1, 2], [2, 2]]

“2”和双“1”的组合重复3次而不是“1”。我不知道我应该怎么做才能解决问题或改进我的代码,以便更好地工作。

4

2 回答 2

2

如果要将单个项目添加到列表中,请使用append. 如果要将两个列表组合在一起,请使用extend.

于 2013-11-08T16:53:42.637 回答
0

提示:

    coins_minus_coin = cash_coins[:]
    coins_minus_coin.remove(coin)

你永远不会使用这个变量。

    for i in sub_coins:
        i.append(coin)
    cash_coins_options.append(sub_coins)

你从不使用i任何一个。我猜你的意思是:

    for i in sub_coins:
        i.append(coin)
        cash_coins_options.append(i)

这解决了 stange 结果的问题,但您的解决方案仍然只会找到[]. 为什么?您的递归只能停在return []; 当您可以使用单个硬币判断价格时,它无法处理另一个基本情况。尝试在顶部添加这个简单的条件:

# actually I changed my mind-
# I assume you're learning so try this one yourself :-)

这将使您的函数表现得更好:

>>> print coin_problem(4, [1,2])
[[2, 1, 1], [1, 2, 1], [2, 2]]

它设法产生正确的答案(即使它重复了其中一些)。

于 2013-11-08T17:06:25.303 回答