我正在尝试创建一个程序,它返回列表中所有整数的总和,大于n或等于n。例如,
>>>floorSum([1,3,2,5,7,1,2,8], 4)
20
以下是我提出的代码:
def floorSum(l,n):
if len(l)>0:
if l[0]<n:
floorSum(l[1:],n)
else:
s=l[0]+floorSum(l[1:],n)
return s
我得到:UnboundLocalError: local variable 's' referenced before assignment.
有什么想法吗?
答案 0 :(得分:3)
您忘记将s
初始化为零
def floorSum(l,n):
s = 0
if len(l) > 0:
if l[0] < n:
s = floorSum(l[1:], n)
else:
s = l[0] + floorSum(l[1:], n)
else:
return 0
return s
答案 1 :(得分:2)
正如其他人指出的那样,你忽略了为所有情况初始化s
并检查长度为零。
这是另一种方法:
def floorSum(l, n):
if len(l) > 1:
mid = len(l) // 2 # Python 3 integer division
return floorSum(l[:mid], n) + floorSum(l[mid:], n)
if len(l) == 1 and l[0] >= n:
return l[0]
return 0
这个版本会在每一步将列表分成两半,所以虽然它没有做任何工作,但递归堆栈的深度是O(log(len(l)))而不是O(len(l) )。这将防止大型列表的堆栈溢出。
此方法的另一个好处是额外的存储要求。 Python在两个版本中都创建了子列表,但在原始版本中,子列表所需的额外存储空间为(n-1) + (n-2) + ... + 1
,即O(n 2 )。使用连续的减半方法,额外的存储要求是O(n log n),对于大的n值,该要求显着更低。分配和释放额外的存储甚至可能影响大n的运行时间。 (但请注意,通过将感兴趣范围的索引作为参数传递而不是创建子列表,可以在两种算法中避免这种情况。)
答案 2 :(得分:0)
谢谢我解决了这个问题!
忘了把s = 0
答案 3 :(得分:-1)
Python是一种很棒的语言,它允许您在列表理解的单行中完成。
s = sum([value for value in l if value >= n])
另一种方法是使用filter
s = sum(filter(lambda e: e >= n, l))
第一个基本上说:
“从l
的元素创建一个新列表,以便它们都大于或等于n
。总结新列表。”
第二个:
“仅过滤大于或等于n
的元素。总结一下。”
您可以找到有关这两种技术的充足文档。
如果您认为答案有用,请将其标记为已接受