尾调用
尾调用指的是函数func
的返回值(或者函数最后一条语句)是对另一个函数func2
的调用。如果func2
和func
相同,就是尾递归咯。尾调用是个更广泛的概念。
效率
尾调用可以不在调用栈上增加新的栈帧,而是更新它,从而像迭代一样,因此尾递归仅占用常量的栈空间。
例子
用wikipedia的代码例子来说明什么是尾递归。
def recsum(x):
if x == 1:
return x
else:
return x + recsum(x - 1)
这里recsum
函数的返回值中x+recsum(x-1)
是一个表达式,在调用了recsum(x-1)
后还需要计算表达式的值,那么就需要继续保留原来recsum(x)
的调用栈,所以不是尾递归。
修改成尾递归的代码:
def tailrecsum(x, running_total=0):
if x == 0:
return running_total
else:
return tailrecsum(x - 1, running_total + x)