Python代码 - 我卡住了 - 递归

时间:2013-11-08 16:41:43

标签: python algorithm

我需要一些帮助,因为我觉得我迷路了。我之前在这个网站上搜索过,当然我已经谷歌了,但请相信我,如果它对我来说这么简单,我根本就没有问过,所以请善待我。 我是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”。 我不知道我该怎么做才能解决问题或改进我的代码以便它能更好地工作。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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]]

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