如何使用递归函数Python查找列表子集的和
我需要编写一个递归函数来返回所有可能子集的和。 我编写了以下代码:如何使用递归函数Python查找列表子集的和,python,algorithm,list,recursion,Python,Algorithm,List,Recursion,我需要编写一个递归函数来返回所有可能子集的和。 我编写了以下代码: def subsets_sums(lst): if len(lst) == 0: return 0 else: sum_list = [sum(lst)] for i in range(len(lst)): index_list = lst.copy() del index_list[i] te
def subsets_sums(lst):
if len(lst) == 0:
return 0
else:
sum_list = [sum(lst)]
for i in range(len(lst)):
index_list = lst.copy()
del index_list[i]
test_list = subsets_sums(index_list)
sum_list = test_list, sum_list
return sum_list
但是由于所有列表的串联,输出非常不美观。
比如:
(((0, [10]), ((0, [3]), [13])), (((0, [10]), ((0, [6]), [16])), (((0, [3]), ((0, [6]), [9])), [19])))
名单如下:
[10,3,6]
如何使其出现在以下列表中:
[0,10,0,3,13,0,10,0,6,16,0,3,0,6,9,19]
我可以更改代码中的某些内容吗?NUM的可能总和为:
其中nums[0]+s
是s
nums[1:][/code>的可能总和,即包括第一个数字的总和
nums[1:://code>的所有可能总和,即不包括第一个数字的总和
def子集和(nums):
如果不是nums:
返回{0}
其他:
剩余和=子集和(nums[1:])
返回{nums[0]+s for s in rest_sums}rest|u sums
例如:
>>子集和([10,3,6])
{0, 3, 6, 9, 10, 13, 16, 19}
要获得所需的输出,您可以尝试:
lst = [10, 3, 6]
def subsets_sums(lst):
if len(lst) == 0:
return [0]
else:
sum_list = [sum(lst)]
for i in range(len(lst)):
index_list = lst.copy()
del index_list[i]
test_list = subsets_sums(index_list)
sum_list = test_list + sum_list
return sum_list
print(subsets_sums(lst))
输出:
[0, 10, 0, 3, 13, 0, 10, 0, 6, 16, 0, 3, 0, 6, 9, 19]
这里有一个方法,它向我们展示了所有可能的子集及其和,包括空集。通过使用索引来迭代,如果要使用子列表操作符
list[:]
,我们可以避免每次复制列表
def f(A, i=0):
if i == len(A):
return [([], 0)]
rest = f(A, i + 1)
return rest + [(s + [A[i]], _s + A[i]) for s, _s in rest]
print f([1, 2, 3])
输出:
[([], 0), ([3], 3), ([2], 2), ([3, 2], 5), ([1], 1), ([3, 1], 4), ([2, 1], 3), ([3, 2, 1], 6)]
为什么您的输出包含重复项?可能的总和是0、10、3、6、13、16、9和19。你能在代码中添加注释吗?没有要求“所有可能的总和”,他们要求“所有可能子集的总和”。你认为区别是什么?你是说有一个
[10,3,6]
的子集的总和不包括在这个输出中,还是说在这个输出中有一个数字不是一个可能的子集的总和?OP在问题描述中提供了这个区别:“我怎样才能使它出现在像:[0,10,0,3,13,0,10,0,6,16,0,3,0,0,6,19]这样的列表中呢?”,不过。这个名单似乎太长了。据我所知,只有2^n个可能的子集。是的,这个列表太长了,在问题的上下文中没有意义。3不是两个不同子集的和。OP的算法不正确,不仅仅是因为输出格式。