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.
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
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(圭多)有说这个在这里.