递归

一、什么是递归?

函数的递归调用:是函数嵌套调用的一种特殊形式

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

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)

 

posted @ 2020-07-31 15:11  正在学Python  阅读(223)  评论(0编辑  收藏  举报