'int'对象没有属性'__getitem__'(再次)

vie*_*291 2 python recursion python-2.7

我试图递归地找到一个列表的总和如下(我知道有一个简单的sum()函数和大量的其他方法):

def rsum(x):

    if not (x):
        return 0
    else:
        sum = x[0] + rsum(x.pop(0))
        return sum
Run Code Online (Sandbox Code Playgroud)

但是,Python一直告诉我x是一个int而不能有operator [].我该如何解决?

对于那些认为我懒得在这里提出这个问题的人:我已经到处寻找,但仍然不知道如何让Python理解x不应该是一个int.

the*_*eye 5

x.pop(0)将删除第一个项目并将其返回.而你正在rsum尝试这样做x[0],但x现在是一个数字.这就是失败的原因.

相反,使用pop第一,并通xrsum喜欢这个

def rsum(x):
    if not x:
        return 0
    else:
        return x.pop() + rsum(x)

print rsum([1, 2, 3])
# 6
Run Code Online (Sandbox Code Playgroud)

如果你想避免改变原始对象,那么使用切片来创建没有第一个元素的新列表,就像这样

def rsum(x):
    if not x:
        return 0
    else:
        return x[0] + rsum(x[1:])

print rsum([1, 2, 3])
# 6
Run Code Online (Sandbox Code Playgroud)

由于您正在学习递归,我希望您也考虑使用Tail Call优化.你可以稍微改变你的功能

def rsum(x, total):
    if not x:
        return total
    else:
        return rsum(x[1:], total + x[0])

print rsum([1, 2, 3], 0)
# 6
Run Code Online (Sandbox Code Playgroud)

在早期的情况下,直到你达到你的基本条件(if not x:),当前函数不能从内存中取出(因为x[0]x.pop()在当前堆栈中,并且它们必须添加递归调用的结果以实际从当前函数返回) .因此,当您在一个非常大的列表上运行此函数时,它将耗尽堆栈空间.但是,在TCO版本中,您将返回另一个函数调用的结果.因此,当前功能不必在内存中.

注意:也就是说,Python不支持Tail Call Optimization.读什么BDFL(圭多)有说这个在这里.