我正在尝试按如下方式递归地查找列表的总和(我知道有一个简单的 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/