函数递归

函数的递归调用

1、函数的调用

是函数嵌套调用了的一种特殊形式,指的是在调用函数的过程中又直接或者间接地调用到本身

1.1 直接的调用本身

def f1():
    print('依旧是我')
    f1()


f1()

1.2 间接的调用本身

def f1():
    print('f1正在运行')
    f2()


def f2():
    print('f2正在运行')
    f1()


f1()

2、重复一段代码的两种方式

2.1 while循环或者for循环

while True:
    print('aaaa')
    print('bbbb')
    print('cccc')

2.2 用函数递归调用来重复,递归的本质其实就是循环

def f1():
    print('aaaa')
    print('bbbb')
    print('cccc')
    f1()  #直接又调用了函数f1本身


f1()

3、结束函数的递归调用

函数调用不应该无限地调用下去,必须在满足某种条件下结束递归调用,否则会产生内存泄漏

3.1 结束while的方法,改变条件

n = 0
while n < 10:
    print(n)
    n += 1  #通过增量赋值改变条件

3.2 结束递归调用的方法,在调用本身前设置调用条件

def f1(n):
    if n == 10:  # 条件为真结束函数调用,条件为假则调用函数本身
        return
    print(n)
    n += 1
    f1(n)


f1(0)

4、递归的两个阶段:回溯与递推

回溯:一层一层调用下去

递推:满足某种结束条件,结束递归调用,然后一层一层返回

图解

某公司四个员工坐在一起,问第四个人薪水,他说比第三个人多1000,问第三个人薪水,第他说比第二个人多1000,问第二个人薪水,他说比第一个人多1000,最后第一人说自己每月5000,请问第四个人的薪水是多少?

思路解析:

要知道第四个人的月薪,就必须知道第三个人的,第三个人的又取决于第二个人的,第二个人的又取决于第一个人的,而且每一个员工都比前一个多一千,数学表达式即:

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)

用递归计算第n个人的工资

def salary(n):
    if n == 1:
        return 5000
    return salary(n - 1) + 1000


print(salary(2))  # 6000 第二人为六千
print(salary(4))  # 8000 第四人为八千

5、递归的应用

def f1(list1):
    for x in list1:
        if type(x) is list:
            # 如果是列表,应该在循环、在判断,即重新调用本身的代码
            f1(x)
        else:
            print(x,end='')


f1(l)  #12345678910111213
posted @ 2020-03-25 20:16  风起千寻  阅读(176)  评论(0编辑  收藏  举报