python之路--遞迴, 二分法
阿新 • • 發佈:2018-12-13
1, 遞迴
自己呼叫自己, 遞迴的入口(引數) 和 出口(return), 樹形結構的遍歷.
def func():
print("我是遞迴")
func()
func()
樹形結構的遍歷 import os def func(lujing, n): # "d:/a/" lst = os.listdir(lujing) # 開啟資料夾. 列出該資料夾內的所有檔名 for el in lst: # el是檔案的名字. b, c # 還原檔案路徑 path = os.path.join(lujing, el) # "d:/a/b" if os.path.isdir(path): # 判斷路徑是否是資料夾 print("..." * n,el) # 顯示資料夾的名字 func(path, n + 1) # 在來一次 ################ else: print("\t" * n,el) # 顯示檔案 func("d:/a", 0)
2, 二分法
掐頭結尾取中間, 查詢效率非常的高
二分法查詢 lst = [1,3,5,7,12,36,68,79] n = int(input("請輸入一個數")) left = 0 right = len(lst) - 1 while left <= right: mid = (left + right)//2 if n > lst[mid]: left = mid + 1 elif n < lst[mid]: right = mid - 1 else: print("存在") break else: print("不存在")
用遞迴方法查詢(第一種)
def func(n, lst): left = 0 right = len(lst) - 1 if lst != []: mid = (left + right)//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, [1,3,5,7,12,36,68,79])
用遞迴方法查詢(第二種)
def func(n, lst, left, right): # 遞迴找到什麼是可以變的. 什麼是不可以變的 if left <= right: mid = (left + right) // 2 if n > lst[mid]: left = mid + 1 return func(n, lst, left, right) elif n < lst[mid]: right = mid - 1 return func(n, lst, left, right) # 遞迴如果有返回值. 所有呼叫遞迴的地方必須寫return else: print("找到了") return mid # 難點 else: print("找不到") return -1 n = int(input("請輸入你要查詢的數:")) lst = [1,3,55,98,37,41,2,5,1,4] ret = func(n, lst, 0, len(lst)-1) print(ret)