06-08 函数递归

一. 函数递归调用介绍

1. 什么是函数的递归调用?

  • 是函数嵌套调用的一种特殊形式.
  • 指的是在调用一个函数的过程中又直接或间接的调用到本身.

2. 直接和间接调用示例

# 直接调用本身
def func():
    print("from func")
    func()

func()   # 报错: RecursionError(在调用Python对象时超过最大递归深度)

# 间接调用本身
def func():
    print("from func")
    bar()

def bar():
    print("from bar")
    func()

bar()  # 报错: RecursionError(在调用Python对象时超过最大递归深度)

3. 查看递归深与设置

"""
死循环与递归的差别:
	死循环并不会产生新的内存空间, 而函数的递归要不断的申请内存空间. 所以函数的递归要设置最大递归深度.
"""
# 查看递归深度: 默认值1000
import sys
print(sys.getrecursionlimit())  # 1000

# 指定递归深度: 但最终会受限于主即操作系统大小的限制
sys.setrecursionlimit(2000)
print(sys.getrecursionlimit())  # 2000

4. 递归的本质就是循环

# 方式一: while, for循环
while True:
    print(111)
    print(222)
    print(333)
    
    
# 方式二: 递归的本质就是循环
def func():
    print(111)
    print(222)
    print(333)
    func()
func()  

5. 强调: 递归不应该无限的调用下去, 必须在满足某种条件下结束递归调用

# while循环示例
i = 0
# 1. while循环
while i < 10:  # 2. 循环结束条件
    print(i, end=' ')  # 0 1 2 3 4 5 6 7 8 9
    i += 1  # 3. 累加条件
    
# 递归本质就是循环示例
def func(i):
    if i == 10:  # 2. 指定同while循环一样的结束循环的条件
        return
    print(i, end=' ')  # 0 1 2 3 4 5 6 7 8 9
    i += 1  # 3. 指定同while循环一样的累加条件

    func(i)  # 1. 同while循环一样让函数循环起来

func(0)

二. 回溯与递推

"""
# 递归的过程分为2个阶段: 回溯 递推
	回溯: 一层一层调用下去
	递推: 满足某种结束条件, 结束递归调用, 然后一层一层返回
	
# 强调: 递归一定要有一个结束条件
"""
# 示例一: 有5个人, 第5个人说我的薪资比第4个人多1000, 第4个人说我的薪资比第3个人多1000, 第3个人说我的薪资比第2个人多1000, 第1个人说我的薪资是5000, 求第5个人的薪资?
def salary(n):
    if n == 1:  # 结束条件
        return 5000    
    return salary(n - 1) + 1000  # salary(4) + 1000 + salary(3) + 1000 + salary(2) + 1000 + salary(1) + 1000

s = salary(5)
print(s)  # 9000

# 示例二: 有5个人, 第5个人说我的年龄比第4个人大2岁, 第4个人说我的年龄比第3个人大2岁,第3个人说我的年龄比第2个人大2岁,第2个人说我的年龄比第1个人大2岁, 第1个人说我的年龄是38, 求第5个人年龄?
def age(n):
    if n == 1:  # 结束条件
        return 38
    return age(n-1) + 2  # 循环条件age(n-1) + 累加条件2  

print(age(5))  # 46

# 应用场景: 需求, 取出列中的每一个值
items = [1, 2, [3, [4, [5, [6, [7, [8, [9, 10, 11, [12, [13, ]]]]]]]]]]
def func(li: list):
    for item in li:  # 结束条件: li被迭代取值完毕
        if isinstance(item, list):
            func(item)  # 循环条件: 如果item不是列表, 那么继续递归
        else:
            print(item, end=' ')

func(items)  # 1 2 3 4 5 6 7 8 9 10 11 12 13 
posted @ 2020-03-25 19:05  给你加马桶唱疏通  阅读(156)  评论(0编辑  收藏  举报