我想建立一个递归函数,找到长度为n> = k> = 0的给定列表的所有大小为'k'的子集,并返回这些子集的列表。
例如: 如果输入列表是[1,2,3,4]并且k = 2则该函数将返回 [[4,3],[2,4],[2,3],[1,4],[1,3],[1,2]]
注意列表的不同布置被认为是相同的列表。
我认为这种递归应该有效:
return [lst[0]] + choose_sets(lst[1:],k-1) ¬¬and¬¬ choose_sets(lst[1:],k)
其中choose_sets(lst,k)
是函数。
意义:
输入:[1,2,3,4],k = 3
调用:
[1] + [2,3,4],k = 2且[2,3,4],k = 3
依旧......
任何人都可以指导我如何在同一时间调用这2个递归调用吗? 我的'现有术语'应该是什么?
感谢。
答案 0 :(得分:2)
假设您有一个大小为n
的列表,并且您需要所有尺寸为k
的子集。
这基本上与:
对于列表中的每个元素,
创建一个没有元素的新列表,
在新列表中,找到大小为k-1
的所有子集(这是递归调用),
并将remove元素添加到所有列表中。
现在......这个解决方案会有重复,例如,在你给出的例子中,你将得到[4,1]和[1,4]。但它可以稍微改变,以便它不会产生重复的结果。
修改强>
处理重复
def choose_sets(l, k):
if k == 0:
return [[]]
if len(l) == 0:
return []
l2 = l[1:]
subsets = choose_sets(l2, k-1)
for s in subsets:
s.append(l[0])
return subsets+ choose_sets(l2, k)
答案 1 :(得分:0)
b = []
def abc(a,k):
if len(a)==k:
b.append(a)
return b
b.extend([a[:k-1]+[i] for i in a[k-1:]])
return abc(a[1:],k)
print abc([1,2,3,4,5],2)