python遞歸函數及二分法查找
阿新 • • 發佈:2018-12-30
打印 code 最快 for 二分法查找 new 過程 python one
函數的遞歸: 在一個函數的內部調用自己
死循環: 可以無限循環,不會停止 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(‘\t‘*n,i) #如果是目錄就打印,n等於幾就是幾個tab鍵分隔 func(path,n+1) #然後再次調用自己,在重復上面的操作, else: print(‘\t‘*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遞歸函數及二分法查找