【发布时间】:2019-04-27 03:37:39
【问题描述】:
我正在尝试编写一个递归函数,该函数将整数 n 和列表 l 作为其输入,并返回可以从 @987654325 中的元素中选择的所有大小 n 组合的列表@。我知道我可以只使用 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_list 和 m,如果你想象 i = 3 时的情况,你会sliced_list 有一个空列表,当您深入到足以建立组合时,m 将为 1。但我并没有与这些基本案例结婚。
让我试着总结一下我的问题:
-
我如何生成一个完全是列表列表的最终结果,而不是列表列表列表的列表...(深度 = n)?
-
我的递归调用应该是什么样的?
-
我是否以完全错误的方式解决这个问题?
【问题讨论】:
-
1、2、4呢?
-
一种方法:查看列表的第一项。首先处理它是组合的一部分的情况 -> 从列表中删除它,减少
n并递归调用并将项目添加到返回的列表项(也是列表);然后是情况二,它不是组合的一部分-> 从列表中删除它但保留n,递归调用,将返回的列表加入到第一种情况的列表中。当然,需要对递归终止进行适当的检查。 -
@Tacratis 我有数学学位,但不知何故我错过了。已编辑。
-
:) 我只是要求确保我正确理解了您的问题,但此后已经有人回答了。
标签: python recursion combinatorics