繁体   English   中英

创建一个递归函数以获取整数列表中所有可能子集的和

[英]Creating a recursive function that gets the sum of all possible subsets in a list of integers

如果我要获得列表[1,2,3]中所有可能的子集组合的总和,我将使用以下代码:

def f():
    for i in range(2):
        for j in range(2):
            for k in range(2):
                    x = i*1 + j*2 + k*3 
                    print x
f()

我该如何对任何列表执行递归函数? 我可以使用itertools.combinations解决此问题,但我想学习递归方法。 谢谢

让我们编写一个递归函数以输出列表所有子集的所有组合。

对于给定的列表,组合就是列表本身,加上列表的所有组合减去每个成员。 直接转换为Python很容易:

def combinations(seq):
    yield seq
    for i in range(len(seq)):
        for combination in combinations(seq[:i] + seq[i+1:]):
            yield combination

但是,这显然会产生重复。 例如,列表[1, 2, 3]包含[1, 2][1, 3] ,并且它们都包含[1] 那么,如何消除这些重复项? 很简单,只需告诉每个子列表跳过多少个元素:

def combinations(seq, toskip=0):
    yield seq
    for i in range(toskip, len(seq)):
        for combination in combinations(seq[:i] + seq[i+1:], i):
            yield combination

现在,您要对所有组合求和吗? 这很容易:

>>> a = [1, 2, 3]
>>> map(sum, combinations(a))
[6, 5, 3, 0, 2, 4, 1, 3]
def allsums(a):
  x = a[0]
  if len(a) > 1:
    yy = allsums(a[1:])
    return set(x + y for y in yy).union(yy)
  else:
    return set([0, x])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM