Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用递归函数Python查找列表子集的和_Python_Algorithm_List_Recursion - Fatal编程技术网

如何使用递归函数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>的所有可能总和,即不包括第一个数字的总和
递归的基本情况是空列表的可能和只有0。我们将使用集合来避免输出中的重复;一个总数要么是可能的,要么不是

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的算法不正确,不仅仅是因为输出格式。