递归函数相关

递归函数

递归函数是指函数间接或者直接的调用了函数自身。

# 直接调用函数本身
def index():
    print('from index')
    index()
    
index()

# 间接调用函数
def index():
    print('from index')
    func()


def func():
    print('from func')
    index()
   
index()

我们尝试运行一下,发现在运行了一段时间会报错,这是python对我们内存的保护措施。官方提供的最大递归深度为1000左右,防止我们无线的递归导致内存溢出。

所以在使用递归时,我们应该设置让递归停下来的点。

def index(n):
    if n == 1:
        return 1
    return index(n-1) * n
res = index(5)
print(res)  # 120

递归实际上有两个过程,先是向下传递,停止递之后是向上回溯,就拿上面的例子来理解。

向下递:

index(5)传入实参5,走index(n-1)*n的分支,将5代入n,即index(4)*5

index(4)传入实参4,走分支,得到index(3)*4

index(3)传入实参3,得到index(2)*3

index(2)传入实参2,得到index(1)*2

index(1)传入实参1,判断走return 1的分支,拿到了返回值1

向上归:

index(1)在index(2)的函数体中,把index(1)*2做返回值,将index(1)的返回值代入index(1),

得到1*2,所以index(2)的返回值是2

index(2)的返回值,表达式为 index(2) = index(1)*2

index(3)的返回值 index(3) = index(2)*3 = index(1)*2*3

index(4)的返回值 index(4) = index(3)*4 = index(1)*2*3*4

index(5)的返回值 index(5) = index(4)*5 = index(1)*2*3*4*5

所以index(n)的返回值最终取决于递归终点的返回值index(1),我们代入index(1) = 1

得到index(5) = 1x2x3x4x5 =120

练习

# 利用递归函数依次打印列表中每一个数据值
l1 = [1, [2, [3, [4, [5, [6, [7, [8, ]]]]]]]]


def search_num(list_tree):
    for i in list_tree:
        if type(i) is list:  # 判断数据类型是否为列表
            search_num(i)  # 如果是列表则递归打印
        else:
            print(i)


search_num(l1)
posted @ 2022-10-12 17:05  leethon  阅读(23)  评论(0编辑  收藏  举报