递归地计算给定列表的子集

时间:2013-04-25 18:17:58

标签: python list recursion

我想建立一个递归函数,找到长度为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个递归调用吗? 我的'现有术语'应该是什么?

感谢。

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)