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

标签 python python-2.7 recursion

我正在尝试按如下方式递归地查找列表的总和(我知道有一个简单的 sum() 函数和许多其他方法):

def rsum(x):

    if not (x):
        return 0
    else:
        sum = x[0] + rsum(x.pop(0))
        return sum

但是,Python 一直告诉我 x 是一个 int,不能有运算符 []。我该如何解决?

对于那些认为我懒得在这里问这个问题的人:我到处都看过但仍然不知道如何让 Python 理解 x 不应该是一个 int。

最佳答案

x.pop(0) 将删除第一项并将其返回。您正在将其传递给 rsum,它正在尝试执行 x[0],但 x 现在是一个数字。这就是它失败的原因。

相反,首先使用 pop,然后像这样将 x 传递给 rsum

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

print rsum([1, 2, 3])
# 6

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

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

print rsum([1, 2, 3])
# 6

既然你正在学习递归,我希望你考虑一下Tail Call optimization以及。你可以像这样稍微改变你的功能

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

print rsum([1, 2, 3], 0)
# 6

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

注意: 也就是说,Python 不支持尾调用优化。阅读 BDFL(Guido)对此有何评论 here .

关于python - 'int' 对象没有属性 '__getitem__'(再次),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29293880/

相关文章:

c - 二分查找树没有打印任何内容

c++ - 静态变量没有增加

Python 问题 : Try and Excepts with if

python - 按下 Windows X 关闭按钮时显示消息框

python - 如何比较 Debian 软件包版本?

python - 带有 python-firebase 的 Firebase 抛出 "Connection reset by peer"(Celery + gevent 参与)

python - 如何比较 2 个列表,其中字符串与备用列表中的元素匹配

python - 使用 .iterrows() 以更简洁的方式遍历 pandas 数据框中的行,并跟踪特定值之间的行

python - 为什么 str 不能得到第二个参数,而 __str__ 可以?

java - 如何修复CodingBat中的递归代码错误?