python二分法查找递归_python递归函数及二分法查找

函数的递归: 在一个函数的内部调用自己

caf3e41689046763ce063136562f2af1d9e.gif

1 死循环: 可以无限循环,不会停止

2 while True:

3 print('我不是递归')

4

5 递归: 不是死循环,有最大循环深度

6 def story():

7 print('我是递归')

8 story()

9 story()

10 超过了递归的最大深度报错

11 RecursionError: maximum recursion depth exceeded while calling a Python object

bdac469f1e963180ec721a29bcf8b0753e4.gif

官网上 源码中设置的递归深度: 1000

自己实际测试递归深度: 998

63d514df5132f778897c4afa509f628d397.gif

1 n = 0

2 def func():

3 global n

4 n += 1

5 print(n)

6 func()

7 func()

8 import sys

9 print(sys.getrecursionlimit()) #查看递归的最大深度

10

11 如果你的递归每次都要超过限制 不适合用递归来解决

12 为什么要有限制? 内存消耗的保护机制

13 设置递归的最大深度

14 import sys

15 sys.setrecursionlimit(1000000)

16

17 n = 0

18 def func():

19 global n

20 n += 1

21 print(n)

22 func()

23 func()

83159ea84d9f30c8ead1b2b8acffb04b14c.gif

总结

1.递归函数的定义 :一个函数在执行的过程中调用了自己

2.递归在python中的最大深度 : 1000/998

3.递归的最大深度是可以自己修改的,但是不建议你修改

c8fdd30fd5584d700d3ceba746fc6b41c34.gif

1 案例(遍历树形结构)

2 import os

3 def func(lujing,n):

4 lst = os.listdir(lujing) #打开文件夹,列出该文件夹中的所有文件及目录

5 for i in lst: #循环文件夹中的所有名字,i相当于文件名

6 path = os.path.join(lujing,i) #拼接循环的文件名路径

7 # print(path)

8 if os.path.isdir(path): #判断拼接后的路径是否是目录

9 print('\t'*n,i) #如果是目录就打印,n等于几就是几个tab键分隔

10 func(path,n+1) #然后再次调用自己,在重复上面的操作,

11 else:

12 print('\t'*n,i) #如果不是目录,就打印文件名

13 func('E:/test/',0) #0为分层间隔

f9d2912b8023c8f7998d408e8cc0e76ff08.gif

二分法查找主要的作用就是查找元素

数据规则: 掐头结尾取中间,必须是有序序列,数据量越大,效率约明显(百万级数据集)

0cf178991520ce30d1067222545a137f857.gif

1 lst = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

2 print(len(lst))

3 n = int(input('<<<<:'))

4 start = 0

5 end = len(lst) -1

6 count = 0

7 while start <= end:

8 mid = (start + end) // 2

9 count+= 1

10 if n > lst[mid]:

11 start = mid +1

12 elif n < lst[mid]:

13 end = mid -1

14 else:

15 print('存在')

16 break

17 else:

18 print('不存在')

19 print('查找了%s次'%count)

20

21 方法2

22 lst = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

23 def func(n,lst):

24 start = 0

25 end = len(lst) -1

26 # count = 0

27 if lst != []:

28 mid = (start + end) //2

29 if n > lst[mid]:

30 func(n,lst[mid+1:])

31 elif n < lst[mid]:

32 func(n,lst[:mid])

33 else:

34 print('存在')

35 return

36 else:

37 print('不存在')

38 return

39 n = int(input('<<<:'))

40 func(n,lst)

41

42 方法3

43 lst = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

44 def func(n,lst,start,end):

45 if start <= end:

46 mid = (start + end) //2

47 if n > lst[mid]:

48 start = mid + 1

49 return func(n,lst,start,end)

50 elif n < lst[mid]:

51 end = mid - 1

52 return func(n,lst,start,end)

53 else:

54 print('找到了')

55 return mid

56 else:

57 print('找不到')

58 return -1

59 n = int(input('<<:'))

60 ret = func(n,lst,0,len(lst)-1)

61 print(ret)

62

63 #最快的查找

64 lst = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

65 new_lst = []

66 for i in range(88):

67 new_lst.append(0)

68 for i in lst:

69 new_lst[i] = 1

70 print(new_lst)

71 i = int(input('<<<:'))

72 if new_lst[i] == 0:

73 print('存在')

74 else:

75 print('不存在')

7400c7e91bec314d30c60bb5b22b24087b5.gif

# me : yuan 比我大2岁

# yuan : wusir 比我大2岁

# wusir : 宝元 比wusir大2岁

# 宝元 : alex比宝元大2岁

# me,yuan,wusir,宝元,alex

# alex 18

# 我多大?

# n = 1,age = q(n+1) -2

# n = 2,age = q(n+1) -2

# n = 3,age = q(n+1) -2

# n = 4,age = q(n+1) -2

# n = 5,age = 18

def q(n):

if n == 1:

age = q(n + 1) - 2

return age

elif n == 2:

age = q(n + 1) - 2

return age

elif n == 3:

age = q(n + 1) - 2

return age

elif n == 4:

age = q(n + 1) - 2

return age

elif n == 5:

return 18

ret = q(1)

print(ret)

# return 能够帮助你停止递归,并且把最内层的结果一层一层的返回到最外层

# 在最内层函数的返回值,返回的时候永远是离最内层最近的上一层才能接收到返回值

执行过程:

def q(1): #3 q(1) #6 q(2) #9 q(3) #12 q(4) #15 q(5)

if 1 == 1: #4 n等于1

age = 12 - 2 #5 此时q(1+1)等于2等于q(n)

return 10 #21 q(2-1),返回值等于12-2=10

def q(2):

elif 2 == 2: #7 符合条件

age = 14 - 2 #8 q(2+1)等于3等于q(n),返回给q(n)

return 12 #20 q(3-1),返回值等于14-2=12

def q(3):

elif n == 3: #10 符合条件

age = 16 - 2 #11 q(3+1)等于4等于q(n),返回给q(n)

return 14 #19 q(4-1),返回值等于16-2=14

def q(4):

elif n == 4: #13 符合条件

age = 16 #14 q(4+1)等于5等于q(n),返回给q(n)

return age #18 q(5-1),返回值等于18-2=16

def q(5):

elif n == 5: #16 符合条件

return 18 #17 返回值为18

#def q(n):

# if n < 5:

# age = q(n + 1) - 2

# return age

# elif n == 5:

# return 18

ret = q(1) #2 #因为这个获取的是q(1)的返回值,而q(1)返回值为10=ret获取返回值10

print(ret) #打印ret返回值

原文出处:https://www.cnblogs.com/selina1997/p/10140136.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值