递归函数,返回从列表中选择的大小为n的组合

时间:2019-04-27 03:37:40

标签: python recursion combinatorics

我正在尝试编写一个递归函数,该函数将一个整数n和一个列表l作为其输入,并返回一个可以从n中选择的大小为n的所有组合的列表。 l中的元素。我知道我可以使用itertools,但是我想变得更好地编写递归函数,并且我相信编写自己的函数会有所帮助。

例如,如果您输入:

  

n = 3

     

l = [1, 2, 3, 4]

我希望输出为:

  

`[[1、2、3],[1、3、4],[2、3、4],[1、2、4]]

到目前为止,我已经编写了以下代码:

def get_combinations(l, n): # returns the possible combinations of size n from a list of chars

    if len(l) == 0:
        return []

    elif n == 1:
        return [l[0]]

    newList = list()

    for i in range(len(l)):

        sliced_list = l[i:]
        m = n - 1

        #lost here, believe I need to make a recursive call somewhere with get_combinations(sliced_list, m)

    return newList

我发现this example of such a function for permutations很有帮助,但是我正在努力实现类似的目的。

为澄清起见,我以我的方式设置了基本案例,因为我希望在递归调用中传递sliced_listm,并且如果您想象{{1 }},您将有一个i = 3的空白列表,并且当您深入到足以建立一个组合时,sliced_list将为1。但是我还没有嫁给这些基本案例。

让我尝试总结一下我的问题:

  1. 如何生成最终结果,该结果恰好是列表列表,而不是列表列表...(depth = n)?

  2. 我的递归调用应该是什么样的?

  3. 我要用完全错误的方式解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

首先,我建议您按如下方式布置函数:

def get_combinations(array, n):
    solutions = []

    # all the code goes here

    return solutions

这样,如果出现问题,例如n == 0,您可以忽略它并获得有效的(空)结果。下一个问题是此行是错误的:

elif n == 1:
    return [array[0]]

如果n == 1要做的正确的事情是返回一个数组,其中每个数组的 元素都包裹在list中:

if n == 1:
    solutions = [[element] for element in array]

是您的基本情况,因为递归的下一层将基于此。接下来是问题的核心。如果n > 1并且数组包含内容,那么我们需要遍历数组的索引。对于每个索引,我们将递归调用当前索引和n - 1之后的所有内容:

sub_solutions = get_combinations(array[index + 1:], n - 1)

这将返回 partial 解决方案。我们需要将元素 at 填充到当前索引中。 array[index],放在sub_solution中每个sub_solutions的前面,并将每个扩充的sub_solution添加到我们在函数末尾返回的solutions列表中:

solutions.append([array[index]] + sub_solution)

就是这样!