python遞迴函式及二分法查詢
阿新 • • 發佈:2018-12-30
函式的遞迴: 在一個函式的內部呼叫自己
死迴圈: 可以無限迴圈,不會停止 while True: print('我不是遞迴') 遞迴: 不是死迴圈,有最大迴圈深度 def story(): print('我是遞迴') story() story() 超過了遞迴的最大深度報錯 RecursionError: maximum recursion depth exceeded while calling a Python object
官網上 原始碼中設定的遞迴深度: 1000
自己實際測試遞迴深度: 998
n = 0 def func(): globaln 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('不存在')