python遞迴和二分法
阿新 • • 發佈:2018-12-13
一.遞迴
1.遞迴就是自己呼叫自己
def fn(): fn() fn() #遞迴深度官方1000 一般都遞迴到998
2.樹形結構的遍歷
import os def fn(lujing, n): lst = os.listdir(lujing) # 開啟資料夾,列出檔案內所有檔名 for i in lst: # 一個一個拿到檔名字 path = os.path.join(lujing, i) # 還原檔案路徑 if os.path.isdir(path): # 判斷是不是資料夾 print("\t" * n, i) fn(path, n + 1) # 遞迴,再一次遍歷資料夾內的檔案 else: print("\t" * n, i) fn("f:/", 0)
3.遞迴的入口(引數) 和 出口(return)
找准入口和出口
二.二分法
掐頭去尾取中間
查詢效率非常的高
1.普通的二分法
lst = [1,3,5,7,12,36,68,79] num = int(input("請輸入你要查詢的數:")) left = 0 right = len(lst) - 1 # 索引就是長度-1 while left <= right: mid = (left + right) // 2 # 取中間的數的索引 if lst[mid] > num: #當num小於中間值的時候就把右邊的截掉 right = mid - 1 elif lst[mid] < num: # 當num大於中間值的時候就把左邊的截掉 left = mid + 1 else: print("找到了") break else: print("沒找到")
2.遞迴二分法
def fn(n, lst, left, right): while left <= right: mid = (left + right) // 2 if lst[mid] > n: right = mid - 1 return fn(n,lst,left ,right) # 遞迴如果有返回值,所有呼叫的地方必須寫return elif lst[mid] < n: left = mid + 1 return fn(n,lst,left, right) else: print("找到了") return mid else: print("沒有找到") return -1 n = int(input("請輸入你要查詢的數:")) print(fn(n, lst,0, len(lst)-1))
三.拓展:
最快的查詢法(在python中比較麻煩,其他語言快,思想可取)
lst = [1,3,55,98,37,41,2,5,1,4] new_list = [] for i in range(max(lst)+1): #找到資料中的最大值並取到最大值個數+1的索引 因為有0 new_list.append(i) new_list[i] = 0 # 意思是弄最大值+1個空格子 for c in lst: new_list[c] = 1 # 把自身的值 放在對應索引的格子裡 n = int(input("請輸入你要查詢的數:")) if new_list[n] == 1: #格子裡有東西就是找到了 print("找到了") else: print("沒有找到")