函数递归以及尾递归调用

什么是递归?


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

官方的定义是一个函数调用其本身

递归的特性


1.必须有一个明确的停止条件

2.每次更深入一层递归时,问题规模要比上次递归都应有所减小

3.递归次数不能太多,否则会造成栈溢出

递归的代码示例


 

递归函数在某些时候具有代码逻辑十分清晰的效果,比如在算数的阶乘的时候。阶乘的定义为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

 递归的优化方法之尾递归优化


因为暂时写不出例子,用以下代码来讲解尾递归优化是怎么一回事儿

#不属于尾递归调用
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)

以上两行代码的区别就在于最后一步,不属于尾递归调用的那个最后一行代码实际上执行步骤如下

res = test1(n-1)  #1

res = n* res   #2

在执行第一步的时候跳入第二层函数的时候需要保存第一层函数的位置,变量等信息在栈中

而属于尾递归调用的最后一行代码执行步骤如下

res = test1(n-1)  #1

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

所以尾递归调用可以减轻栈的负荷

原文地址:https://www.cnblogs.com/codescrew/p/8661044.html