函数的递归调用:是函数嵌套调用的一种特殊形式 具体是指: 在调用一个函数的过程中又直接或者间接地调用到本身
1、直接调用本身
def f1():
print('我调我自己')
f1()
f1()
2、间接调用本身
def f1():
print('===>f1')
f2()
def f2():
print('===>f2')
f1()
f1()
如何理解递归:
# 一段代码的循环运行的方案有两种
方式一:while、for循环
while True:
print(1111)
print(2222)
print(3333)
# 方式二:递归的本质就是循环:
def f1():
print(1111)
print(2222)
print(3333)
f1()
f1()
如何结束一个递归函数:
def f1(n):
if n == 10:
return
print(n)
n+=1
f1(n)
f1(0)
递归的两个阶段:
回溯:一层一层调用下去
递推:满足某种结束条件,结束递归调用,然后一层一层返回
例:
某公司四个员工坐在一起,问第四个人薪水,他说比第三个人多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个员工的薪水,需要回溯得到(n-1)个员工的薪水,以此类推,直到得到第一个员工的薪水,此时,salary(1)已知,因而不必再向前回溯了。然后进入递推阶段:从第一个员工的薪水可以推算出第二个员工的薪水(6000),从第二个员工的薪水可以推算出第三个员工的薪水(7000),以此类推,一直推算出第第四个员工的薪水(8000)为止,递归结束。需要注意的一点是,递归一定要有一个结束条件,这里n=1就是结束条件。
代码实现:
def salary(n):
if n==1:
return 5000
return salary(n-1)+1000
s=salary(4)
print(s)
递归的应用
l=[1,2,[3,[4,[5,[6,[7,[8,[9,10,11,[12,[13,]]]]]]]]]]
def f1(list1):
for x in list1:
if type(x) is list:
# 如果是列表,应该再循环、再判断,即重新运行本身的代码
f1(x)
else:
print(x)
f1(l)