Day30:理解递归的特例:尾递归
2020-06-21 本文已影响0人
快乐的老周
使用递归会使代码变得非常简洁,但是递归利用不慎,很容易就会出现:stack overflow 栈溢出的问题,这是因为通常的递归也需要消耗在系统调用栈上产生的隐式额外空间,这算是我们使用递归所付出的代价。
但是有一类递归非常特殊,它不受此空间开销的影响。它就是一种特殊的递归情况:尾递归。
那么,满足哪些条件才算是尾递归呢?下面的两种代码示例,哪个是尾递归,哪个是一般的递归情况呢?
写法1:
def sum1(ls):
if len(ls) == 0:
return 0
return ls[0] + sum1(ls[1:])
写法2:
def sum2(ls):
def helper(ls, acc):
if len(ls) == 0:
return acc
return helper(ls[1:], ls[0] + acc)
return helper(ls, 0)