如何使用递归获取列表中所有元素的总和

时间:2014-08-10 09:50:42

标签: python list recursion

def sumAll(lis):
    return 0 if isEmpty(lis)== True\
    else head(lis)+sumAll(tail(lis))

def isEmpty(lis):
    return True if lis==0 else False

def head(lis):
    return lis[0]

def tail(lis):
    return lis[1:]

a=input()

print sumAll(a)

谁能告诉我为什么它不会工作?任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

你应该这样做:

return 0 if not lis else head(lis)+sumAll(tail(lis))

而不是:

return 0 if isEmpty(lis) else head(lis)+sumAll(tail(lis))

isEmpty(lis)始终为False,因为:

>>> isEmpty([])
False

为什么使用递归?我希望它只是练习递归..

提示:始终使用调试器来真正了解程序的流程并更好地捕获错误。

答案 1 :(得分:1)

使用尾递归:

def sumAll(lis, summed = 0):
    if not lis:
        return summed
    else:
        summed += lis[0]
        return sumAll(lis[1:],summed)

In [2]: sumAll([1,2,3])
Out[2]: 6

In [3]: sumAll([1,2,3,4,5])
Out[3]: 15

Python没有针对尾递归进行优化,因此在Python中使用它没有任何优势,但在其他语言中可能是有利的,因为它避免了创建多余的堆栈帧,因为该函数返回递归调用的结果。
该函数只调用自身,直到条件为True。

在您的代码中,所有递归调用必须在计算最终总和之前完成。 如果您在pythontutor中运行代码,您将看到差异。

在您的代码更改中:

def isEmpty(lis):
    return True if not lis else False # change to "not lis", which is an empty list []

lis永远不会是== 0,以检查您可以使用if not lis的空列表。

def sum_all(lis):
    if isEmpty(lis): # same as if is_empty(lis) == True
        return 0
    else:
        return head(lis) + sum_all(tail(lis))

def is_empty(lis):
    return not lis

def head(lis):
    return lis[0]

def tail(lis):
    return lis[1:]

您可以将自己的代码简化为:

def sum_all(lis):
    if not lis: # same as if is_empty(lis) == True
        return 0
    else:
        return lis[0] + sum_all(lis[1:])

答案 2 :(得分:0)

如何减少

def sum(container):
    if len(container) == 1: 
        return container[0]
    if not container: 
        return 0

    val = container.pop()
    container[0] += val

    return sum(container)