Python 如何找到满足sum(L)=k的列表中元素的和,其中L是列表,k是正整数?
给定列表L或L和k正整数的子列表作为输入,我需要定义一个递归函数(不使用切片),它的输入是(L,k),如果和(L)=k,则返回True,否则返回False 我尝试了以下代码:Python 如何找到满足sum(L)=k的列表中元素的和,其中L是列表,k是正整数?,python,Python,给定列表L或L和k正整数的子列表作为输入,我需要定义一个递归函数(不使用切片),它的输入是(L,k),如果和(L)=k,则返回True,否则返回False 我尝试了以下代码: 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.combination
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开始)将每个子列表的元素逐一求和,直到到达最后一个元素:
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
解释代码的哪一部分不起作用。您得到了哪些错误的结果,以及您期望的结果是什么?欢迎使用堆栈溢出!我可以在你的代码中看到一个明显的错误,但如果你能更详细地解释“对我来说不太好”,这会有很大帮助。你应该发布错误并回溯你得到的信息。谢谢,我刚刚修改了我的帖子:)她在问题中提到我们不能使用切片语法。@Shubham-Oups我错过了。谢谢,我更新了我的答案以避免使用切片。谢谢你的答案,但是如果你尝试recIfSum([1,4,8,9],18),它会返回false,即使[1,4,8,9]包含满足8+9+1=18的子列表。很抱歉,我在问题中没有提到这一点。@romanasa好的,我在您最初的请求中遗漏了这一点(我仍然觉得不太清楚),但现在我明白了。关于你的评论,我更新了我的答案。@Laurent H.很有魅力,谢谢你的帮助:)