Python的函数递归

一、函数的递归

  什么是函数的递归:函数的递归就是函数的递归调用:是函数嵌套调用的一种形式。

  具体是指:在调用一个函数的过程中又直接或者间接的调用到本身。

# 1、直接调用本身(简单理解为死循环 )
def f1():
    print('直接调用本身实例:')
    f1()

f1()
# RecursionError: maximum recursion depth exceeded while calling a Python object
#  。python对递归做了限制1000层,否则无限的调用下去,不断的申请内存空间,直到内存溢出。
# 了解python的递归层级

import sys
>>> sys.getrecursionlimit()  # 可以使用sys.getrecursionlimit()去查看递归深度,默认值为1000
 1000 
>>> sys.getrecursionlimit(2000) # 可以自己定义对限制进行修改为2000,不建议这样做,容易造成内存溢出。
>>> sys.getrecursionlimit()
2000
python不是一门函数式编程语言,无法对递归进行尾递归优化(了解)
函数的递归:直接调用示意图:

# 2、间接调用本身()
def f1():
    print("===>f1")
    f2()

def f2():
    print("===>f2")
    f1()

f1()
# RecursionError: maximum recursion depth exceeded while calling a Python object

函数的递归:间接调用示意图:

二、递归与循环
# 递归与循环:递归的本质就是循环,递归能做的,while循环都能做。
# 一段diamond循环的方案有两种
# 方式一:while、for循环
# while True:
#     print(1111)
#     print(2222)
#     print(3333)
# 这个不能停止

# 方式二:使用递归
def f1():
    print(1111)
    print(2222)
    print(3333)
    f1()

f1()
# RecursionError: maximum recursion depth exceeded while calling a Python object
# 需要强调一点:
# 1、递归不应该无限的调用下去,必须在满足某种条件下结束递归

# 使用while循环:输出1-10的数据
# n = 0
# while n<10:
#     print(n)
#     n +=1

# 使用递归:输出1-10的数据
def f1(n):
    if n == 10:
        return
    print(n)
    n += 1
    f1(n)
f1(0)

三、回溯和递推

# 递归两个阶段:回溯与递推

# 回溯:一层一层的调用下去
# 递推:满足某种结束条件后,结束递归调用,然后一层一层返回。

# 举例:询问年龄
# A比B大10岁,B比C大10岁,C比D大10岁,D比E大10岁,E为18岁  # 回溯:

# age(5) = age(4) + 10
# age(4) = age(3) + 10
# age(3) = age(2) + 10
# age(2) = age(1) + 10
# age(1) = 18

def age(n):
    if n == 1:
        return 18
    return age(n -1) + 10

res = age(5)
print(res)
某公司四个员工坐在一起,问第四个人薪水,他说比第三个人多1000,问第三个人薪水,第他说比第二个人多1000,
问第二个人薪水,他说比第一个人多1000,最后第一人说自己每月5000,请问第四个人的薪水是多少? 代码实现:
def salary(n):
    if n == 1:
        return 5000
    return salary(n - 1) + 1000

res = salary(4)
print(res)
思路解析:

要知道第四个人的月薪,就必须知道第三个人的,第三个人的又取决于第二个人的,第二个人的又取决于第一个人的,
而且每一个员工都比前一个多一千,数学表达式即:
# salary(4)-->salary(3)+1000-->salary(2)+1000 + 1000-->salary(1)+1000+1000+1000-->5000+1000+1000+1000
# salary(4)-->salary(3)+1000-->salary(2)+1000《==None+1000(TypeError: unsupported operand type(s) for +: 'NoneType' and 'int')《==5000+1000
# TypeError: unsupported operand type(s) for +: 'NoneType' and 'int' 翻译:None类型和整型进行了加操作。
# 解决办法:添加返回值return
# salary(4) = 8000《==5000+1000+1000+1000《==5000+1000+1000《==5000+1000《==5000
#                      salary(4)            salary(3)         salary(2)    salary(1)
salary(4)=salary(3)+1000 
salary(3)=salary(2)+1000 
salary(2)=salary(1)+1000 
salary(1)=5000
总结为: 
salary(n)=salary(n-1)+1000 (n>1) 
salary(1)=5000 (n=1) 

回溯和递推示意图如下:

  四、递归的应用

# 需求:把如下列表的所有值取出来,并打印。
# l = [1,2,[3,[4,[5,[6,[7,[8,[9,10,11]]]]]]]]

# 方式一:使用循环实现需求
# l = [1,2,[3,4]]
# for x in l:
#     if type(x) is list:
#         # 如果是列表,应该再次循环,再次判读,再次打印,即重新运行本身的代码。
#         for a in x:
#             if type(a) is list:
#                 pass
#             else:
#                 print(a)
#     else:
#         print(x)
# 运行结果:1 2 3 4
# 方式二:使用递归实现需求 l = [1,2,[3,4]] def f1(list1): for x in list1: if type(x) is list: # 如果是列表,应该再次循环,再次判读,再次打印,即重新运行本身的代码。 f1(x) else: print(x) f1(l) # 运行结果:1 2 3 4 5 6 7 8 9 10 11

 

posted @ 2020-04-09 22:10  思江  阅读(1026)  评论(0编辑  收藏  举报