用通俗的话来讲就像问路,张三问李四,李四问王五,王五问赵六 赵六知道答案回复了王五,王五回复了李四,李四回复了张三,问路结束函数
官方的定义是一个函数调用其自己优化
1.必须有一个明确的中止条件spa
2.每次更深刻一层递归时,问题规模要比上次递归都应有所减少code
3.递归次数不能太多,不然会形成栈溢出blog
递归函数在某些时候具备代码逻辑十分清晰的效果,好比在算数的阶乘的时候。阶乘的定义为n! = 1 × 2 × 3 × … × n,示例代码以下所示:递归
def jiecheng(n): if n==1: return n else: return n*jiecheng(n-1) res = jiecheng(5) print(res) #打印结果为120
由于暂时写不出例子,用如下代码来说解尾递归优化是怎么一回事儿class
#不属于尾递归调用 def test1(n): if n==1: return n else: return n*test1(n-1)
#属于尾递归调用 def test2(n): if n==1: return n else: return test2(n-1)
以上两行代码的区别就在于最后一步,不属于尾递归调用的那个最后一行代码实际上执行步骤以下test
res = test1(n-1) #1变量
res = n* res #2方法
在执行第一步的时候跳入第二层函数的时候须要保存第一层函数的位置,变量等信息在栈中
而属于尾递归调用的最后一行代码执行步骤以下
res = test1(n-1) #1
在跳入第二层函数的时候第一层的函数实际上已经结束,不须要保存第一层函数相关的全部信息了。
因此尾递归调用能够减轻栈的负荷