函数递归
函数的递归调用
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