Python - 列表中的整数之和(递归)

时间:2016-10-27 12:52:29

标签: python recursion sum

我正在尝试创建一个程序,它返回列表中所有整数的总和,大于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.

有什么想法吗?

4 个答案:

答案 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的元素。总结一下。”

您可以找到有关这两种技术的充足文档。

如果您认为答案有用,请将其标记为已接受