Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 递归组合表_Python_List_Recursion_Combinations - Fatal编程技术网

Python 递归组合表

Python 递归组合表,python,list,recursion,combinations,Python,List,Recursion,Combinations,我目前正在尝试编写一些代码,给定一个硬币值列表,将返回所有可能的硬币组合,并将其相加为某个值。以下是程序应如何运行的示例: >>> 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]] 我得到了要填写的以下代码模板: def find_changes(n, coins): if n < 0: return []

我目前正在尝试编写一些代码,给定一个硬币值列表,将返回所有可能的硬币组合,并将其相加为某个值。以下是程序应如何运行的示例:

>>> 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]]
我得到了要填写的以下代码模板:

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

它目前不工作。我做错了什么?

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

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

all_changes.append([last_used_coin])   
# Add a list of one element to the `all_changes` list
但是,您的代码仍然不能正常工作。让我们试着把代码通读一遍

如果我们看一下你的
循环,它正在循环你列表中每一个可能的硬币。您采取了正确的下一步——通过您的线路
find\u changes(n-last\u used\u coins,coins)
,找到了
n-last\u used\u 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])
def find_更改(n,硬币):
如果n<0:
返回[]
如果n==0:
返回[]]
所有更改=[]
对于最后一次使用的硬币:
组合=查找更改(n-最后使用的硬币,硬币)
对于组合中的组合:
追加(最后使用的硬币)
所有更改。追加(组合)
返回所有更改
打印查找更改(4、[1,2,3])

它应该做什么?怎么了?家庭作业需要更多的努力……是的,我知道,它应该返回一个所有可能组合的列表,给我们一个和n,我对Python上的递归不太熟悉,所以……你应该首先弄清楚基本情况是什么,然后弄清楚如何将问题分解成更小的子问题。如果这很难(因为这不是最简单的递归问题),请先尝试解决类似斐波那契递归的问题。@user2928714——欢迎使用StackOverflow!你被否决的原因是,乍一看,你好像在问一个问题,但没有说明问题是什么,或者你想做什么。我试着帮你解决你帖子中的一些问题,但在将来,试着更清楚地问你的问题,并学习你在StackOverflow上的帖子。我在斐波那契数列中取得了成功,但在这个问题上没有成功,…非常感谢你,迈克尔,我非常感谢!适应递归思维需要时间,尽管我完全理解如何将其应用于数学递归定义。这是一个问题,其结果是:[[1],[1],[1],[1],1,1],[1],1],[2],[1],[1],[1],[1],[2],[1],[1],[1],[1],[1],[1],[1],[1],[1],[1],[1],[1],[2],[1],[1],[1],[1],[1],[1],[1],[1],[1],[1],[1],[1],[1],[2],[1][[1]、[1]、[1]、[1]、[1]、[1]、[1]、[2]、[1]、[2]、[1]、[1]、[1]、[1]、[2]、[1]、[1]、[1]、[1]、[2]、[1]、[1]、[2]、[1]、[3]、[1]、[1]、[1]、[1]、[2]、[1]、[2]、[1]、[1]、[1]、[2]、[2]、[2]、[1]、[1]、[1]、[1]、[2]、[2]、[1]、[2]、[2]、[1]、[2]、[2]、[2]、[2]、[2]、[4](我在
所有更改
中添加了
组合
而不是
组合
)再次感谢您,是否有一本学习递归和递归思维的推荐书(它通常是如何工作的。适应递归思维)-还有推荐书吗?当然,这两本书都应该是一般性的,不是专门介绍python的…谢谢
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])