函数递归以及尾递归调用

什么是递归?


用通俗的话来讲就像问路,张三问李四,李四问王五,王五问赵六   赵六知道答案回复了王五,王五回复了李四,李四回复了张三,问路结束函数

官方的定义是一个函数调用其自己优化

递归的特性


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

在跳入第二层函数的时候第一层的函数实际上已经结束,不须要保存第一层函数相关的全部信息了。

 

因此尾递归调用能够减轻栈的负荷

相关文章
相关标签/搜索