如果我要在列表[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解决这个问题,但我想学习递归方式。 感谢
答案 0 :(得分:1)
让我们编写一个递归函数来输出列表中所有子集的所有组合。
对于给定的列表,组合是列表本身,加上列表的所有组合减去每个成员。这很容易直接翻译成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]
答案 1 :(得分:0)
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])