Python代码-I';m-递归

Python代码-I';m-递归,python,algorithm,Python,Algorithm,我需要一些帮助,因为我想我迷路了。我以前在这个网站上搜索过,当然我也用谷歌搜索过,但相信我,如果对我来说这么简单,我根本就没有问过,所以请善待我。 我是python新手,编码对我来说并不那么容易 无论如何,请看一下我的代码: def coin_problem(price, cash_coins): if (price < 0): return [] if (price == 0): return [[]] options = []

我需要一些帮助,因为我想我迷路了。我以前在这个网站上搜索过,当然我也用谷歌搜索过,但相信我,如果对我来说这么简单,我根本就没有问过,所以请善待我。 我是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])
我得到的东西更像:

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

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

提示:

    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结果的问题,但您的解决方案仍然只能找到
[]
。为什么?递归只能在
返回[]
时停止;当你用一枚硬币就能说出价格时,它无法处理另一个基本情况。尝试在顶部添加以下简单条件:

# 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]]

它能够产生正确的答案(即使它复制了其中的一些答案)。

我没有看到递归,但我确实看到您将
现金硬币
用作可数和函数。cmd:的确,我的错误。再查一遍。现在呢?E先生:我又错了。再次检查。
现金问题
应该是
硬币问题
?确实如此。对不起我所有的错误。。。希望这是我的最后一个问题。在StackOverflow上,当问题得到回答时,我们不会删除它们——我们将它们保留下来,以便其他人也可以从中学习。你可以自己删除,如果你真的想要,但请考虑离开它。我更喜欢它之前:-)你大多改名变量,我做了同样的新版本,并得到相同的结果。
>>> print coin_problem(4, [1,2])
[[2, 1, 1], [1, 2, 1], [2, 2]]