递归
一、什么是递归?
函数的递归调用:是函数嵌套调用的一种特殊形式
具体是指,在调用一个函数的过程中又直接或者间接的调用到本身。
def f1():
print('我直接调我自己")
f1()
f1() # 递归就是函数的循环,但是每一层都没有结束,不断的申请内存空间,最终会导致内存溢出。Python规定了最多递归2000层。
-----------------------------------------------------------------------------------------------------------》
def f1():
print("我是f1,我调f2,但是我最终会间接调我自己”)
f2()
def f2():
print("我是f2,我调f1")
f1()
f1() # f1 通过调用f2最终间接调用自己。
-------------------------------------------------------------------------------------------------------------》
所以呢,循环的方式有两种啊。一个是通过for 和 while, 一个是通过递归。递归在有些情况下会非常简单。
但是使用递归呢,需要注意,递归不应该无限的调用下去,一定要设置一个结束条件。
def f1():
if n == 10:
return
print(n)
n+=1
f1(n)
f1(0)
二、什么是递归的两个阶段?
1.回溯 一层一层调用下去的过程叫做回溯,往下回溯
2.递推 往下回溯的过程中,终于到达结束条件后,再一层一层往回结束,这个一层一层往回推的过程叫做递推。
f1 : f 函数 第一层
f2 : f 函数 第二层
....
f5 : f 函数 第五层 第五层的时候拿到了结束条件,得到一个值,然后从第五层开始往回递推,一层层结束。
三、递归的应用
l = [1,2,[3,[4,[5,[6,[7,[8,[9,10,11]]]]]]]] # 将l中每一个元素 都取出来。
# 先定义一个取单个元素的函数
l1 = []
def func(l):
for i in l: # 遇到l 里头嵌套列表怎么办?
if type(i) == list:
func(i)
else:
l1.append(i)
return l1
res = func(l)
print(res) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
三、递归的应用---二分法
# 有一个顺序存放数字的列表l。任意给一个值,判断是否在列表中。
def find_num(l,num):
print(l)
if len(l) != 0:
index_num = len(l) // 2
if num == l[index_num]:
print(f'数字{num}存在')
return
if num > l[(index_num)]:
l = l[index_num+1:]
find_num(l,num)
if num < l[index_num]:
l = l[:index_num]
find_num(l,num)
else:
print('找不到')
return
l = [1, 2, 5, 8, 9, 12, 13, 16, 25, 31, 42, 54, 55, 66, 77, 91]
num = 14
find_num(l,num)