给定列表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。
答案 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