python递归函数及二分法查找
Posted wangm-0824
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python递归函数及二分法查找相关的知识,希望对你有一定的参考价值。
函数的递归: 在一个函数的内部调用自己
死循环: 可以无限循环,不会停止 while True: print(‘我不是递归‘) 递归: 不是死循环,有最大循环深度 def story(): print(‘我是递归‘) story() story() 超过了递归的最大深度报错 RecursionError: maximum recursion depth exceeded while calling a Python object
官网上 源码中设置的递归深度: 1000
自己实际测试递归深度: 998
n = 0 def func(): global n n += 1 print(n) func() func() import sys print(sys.getrecursionlimit()) #查看递归的最大深度 如果你的递归每次都要超过限制 不适合用递归来解决 为什么要有限制? 内存消耗的保护机制 设置递归的最大深度 import sys sys.setrecursionlimit(1000000) n = 0 def func(): global n n += 1 print(n) func() func()
总结
1.递归函数的定义 :一个函数在执行的过程中调用了自己
2.递归在python中的最大深度 : 1000/998
3.递归的最大深度是可以自己修改的,但是不建议你修改
案例(遍历树形结构) import os def func(lujing,n): lst = os.listdir(lujing) #打开文件夹,列出该文件夹中的所有文件及目录 for i in lst: #循环文件夹中的所有名字,i相当于文件名 path = os.path.join(lujing,i) #拼接循环的文件名路径 # print(path) if os.path.isdir(path): #判断拼接后的路径是否是目录 print(‘ ‘*n,i) #如果是目录就打印,n等于几就是几个tab键分隔 func(path,n+1) #然后再次调用自己,在重复上面的操作, else: print(‘ ‘*n,i) #如果不是目录,就打印文件名 func(‘E:/test/‘,0) #0为分层间隔
二分法查找主要的作用就是查找元素
数据规则: 掐头结尾取中间,必须是有序序列,数据量越大,效率约明显(百万级数据集)
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] print(len(lst)) n = int(input(‘<<<<:‘)) start = 0 end = len(lst) -1 count = 0 while start <= end: mid = (start + end) // 2 count+= 1 if n > lst[mid]: start = mid +1 elif n < lst[mid]: end = mid -1 else: print(‘存在‘) break else: print(‘不存在‘) print(‘查找了%s次‘%count) 方法2 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] def func(n,lst): start = 0 end = len(lst) -1 # count = 0 if lst != []: mid = (start + end) //2 if n > lst[mid]: func(n,lst[mid+1:]) elif n < lst[mid]: func(n,lst[:mid]) else: print(‘存在‘) return else: print(‘不存在‘) return n = int(input(‘<<<:‘)) func(n,lst) 方法3 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] def func(n,lst,start,end): if start <= end: mid = (start + end) //2 if n > lst[mid]: start = mid + 1 return func(n,lst,start,end) elif n < lst[mid]: end = mid - 1 return func(n,lst,start,end) else: print(‘找到了‘) return mid else: print(‘找不到‘) return -1 n = int(input(‘<<:‘)) ret = func(n,lst,0,len(lst)-1) print(ret) #最快的查找 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] new_lst = [] for i in range(88): new_lst.append(0) for i in lst: new_lst[i] = 1 print(new_lst) i = int(input(‘<<<:‘)) if new_lst[i] == 0: print(‘存在‘) else: print(‘不存在‘)
以上是关于python递归函数及二分法查找的主要内容,如果未能解决你的问题,请参考以下文章