递归-Python币组合列表

use*_*714 -3 python recursion combinations list

我目前正在尝试编写一些代码,在给定硬币值列表的情况下,它将返回总和为某个值的所有可能的硬币组合。这是程序应该如何运行的示例:

>>> find_changes(4,[1,2,3])
[[1, 1, 1, 1], [2, 1, 1], [1, 2, 1], [3, 1], [1, 1, 2], [2, 2], [1, 3]]
Run Code Online (Sandbox Code Playgroud)

我得到了以下代码模板来填写:

def find_changes(n, coins):
    if n < 0:
        return []
    if n == 0:
         return [[]]
    all_changes = []

    for last_used_coin in coins:
        ### DELETE THE "pass" LINE AND WRITE YOUR CODE HERE
        pass

    return all_changes
Run Code Online (Sandbox Code Playgroud)

我尝试在for循环中使用以下代码:

all_changes.append[last_used_coin]
find_changes(n-last_used_coin,coins)
Run Code Online (Sandbox Code Playgroud)

它目前不起作用。我究竟做错了什么?

Mic*_*x2a 6

您的答案很接近,但由于语法错误和逻辑错误的组合而失败。

请记住,append是一个方法调用——您需要在括号周围添加一组括号,如下所示:

all_changes.append([last_used_coin])   
# Add a list of one element to the `all_changes` list
Run Code Online (Sandbox Code Playgroud)

但是,您的代码仍然不能正常工作。让我们尝试通过代码挑选。

如果我们查看您的for循环,它会遍历您列表中所有可能的硬币。你把正确的下一步-你找到了所有可能的硬币组合n - last_used_coin通过您的线路find_changes(n - last_used_coin, coins)

现在,您需要做的就是遍历所有可能的硬币组合,从调用find_changes、重新last_used_coin添加到 并将所有内容附加到all_changes列表中。

这是最终的工作代码:

def find_changes(n, coins):
    if n < 0:
        return []
    if n == 0:
         return [[]]
    all_changes = []

    for last_used_coin in coins:
        combos = find_changes(n - last_used_coin, coins)
        for combo in combos:
            combo.append(last_used_coin)
            all_changes.append(combo)

    return all_changes

print find_changes(4, [1,2,3])
Run Code Online (Sandbox Code Playgroud)