递归的定义

什么是递归:函数递归是指“直接调用或间接调用”函数本身

直接调用:指的是在函数内置,直接调用函数本身

间接调用:两个函数之间相互调用间接造成递归

代码特点:

1 函数内部的代码是相同的,只是针对参数不同,处理的结果不同

2 当参数满足一个条件是,函数不在执行

这个通常被称为递归的出口,否则会出现死循环

  • 这是一种函数嵌套调用的表现形式
  • 最大递归层数限制:998,
获取递归深度: 了解
            sys.getrecursionlimit()

设置递归深度: 了解
            sys.setrecursionlimit(深度值)

下面是一个递归函数的实例:

def calc(n):

    print(n)

    if int(n/2) > 0:  # 回溯,每一次执行都要拿到一个更接近于结果的结果
        calc(int(n/2))
    else:
        print('------')

    print(n)  # 当回溯找到一个终止条件后,开始一步一步往上递推
calc(10)

打印结果:
10
5
2
1
------
1
2
5
10

递归分解

def calc(10):
    print(10)
    if int(10/2) > 0:
    
        def calc(5):
            print(5)
            if int(5/2) > 0:

                def calc(2):
                    print(2)
                    if int(2/2) > 0:

                        def calc(1):
                            print(1)
                            print('------')
                            print(1)
                    print(2)
            print(5)
    print(10)

最大递归

def foo(n):
    print(n)
    n += 1
    foo(n)
foo(1)

遵循两个条件

想要递归有意义,必须遵循两个条件:

  • 回溯:
    指的是重复地执行, 每一次执行都要拿到一个更接近于结果的结果,
    回溯必要有一个终止条件。

  • 递推:
    当回溯找到一个终止条件后,开始一步一步往上递推。

练习

利用递归函数打印出列表中的每一个元素,l = [1,[2,[3,[4,[5,[6,[7,[8,[9]]]]]]]]]]

l = [1,[2,[3,[4,[5,[6,[7,[8,[9]]]]]]]]

def get_all(l):
    for item in l:
        if isinstance(item, (tuple, list, dict, set)) == True:
            get_all(item)
        else:
            print(item)
get_all(l)

# 循环取出第一个元素,判断是否是元组列表等
# 如果 1 不是,else 打印出来
# 此时 循环的结果是 [2,[3,[4,[5,[6,[7,[8,[9]]]]]]]]]
# 是一个列表,将递归调用 get_all 函数,取出2 打印出来

小结

使用递归函数的优点是 逻辑简单清晰,缺点是过深的调用会 导致栈溢出

 posted on 2019-11-15 17:27  Rannie`  阅读(329)  评论(0编辑  收藏  举报
去除动画
找回动画