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



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

例如,如果您输入:

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

我发现这个用于排列的此类函数的示例很有帮助,但我正在努力实现类似的东西。

为了澄清,我以我的方式设置了我的基本情况,因为我期望在我的递归调用中传递sliced_listm,如果你想象i = 3时的情况,你将有一个空的sliced_list列表,当你深入到足以建立一个组合时,m将是 1。但我没有与这些基本案例结婚。

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

  1. 我如何生成一个最终结果,它完全是一个列表列表,而不是列表列表的列表列表......(深度 = n)?

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

  3. 我是否以完全错误的方式解决这个问题?

首先,我建议您像这样布局函数:

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)

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

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

就是这样!

最新更新