如何找到列表中满足sum(L)= k的元素之和,其中L是一个列表,k是正整数?

时间:2018-05-02 10:13:39

标签: python

给定列表L或L和k正整数的子列表作为输入,我需要定义一个递归函数(不使用切片),其输入为(L,k)并且如果sum(L)= k则返回True如果没有,则为假。

我尝试了以下代码:

def sum_rec(L,k):
   import itertools
   n = len(L)
   i=0
   if sum(L) == k:
        return True
   while len(L)> 1:
       sub_L = list(itertools.combinations(L, n-i-1))
       i+=1
       for sub_lst in sub_L:
           s_rec(sub_lst,k)
   else:
       return False

我收到“ValueError:r必须是非负数”,代码也没有检查所有子列表。还有其他办法吗?我正在使用python 3.6。

1 个答案:

答案 0 :(得分:0)

我建议您使用以下解决方案,通过递归(从索引0)逐个求和每个子列表的元素,直到到达最后一个元素:

from itertools import combinations

def AllSublists(L):
    """ Return list of sub-lists (of any size) from list L """
    return [list(j) for i in range(1, len(L)+1) for j in list(combinations(L, i))]

def RecIfSum(L, k, i=0):
    """ --------------- Recursive function -------------------
        Return True if sum(L) equals k, otherwise return False """
    if (i == len(L)-1):
        return (L[i] == k)
    else:
        L[i+1] += L[i]
        return RecIfSum(L, k, i+1)

def CheckIfSum(myList, k):
    """ Return True if the sum of a sub-list of myList equals k, otherwise return False """
    for L in AllSublists(myList):
        if RecIfSum(L, k):
            return True
    return False

print(CheckIfSum([1,4,8,9], 18)) # True
print(CheckIfSum([1,4,8,9], 19)) # False
print(CheckIfSum([1,4,8,9], 20)) # False
print(CheckIfSum([1,4,8,9], 21)) # True
print(CheckIfSum([1,4,8,9], 22)) # True