遞歸與二分法
- 2020 年 1 月 20 日
- 筆記
遞歸
自己調用自己
遞歸的入口(參數)和出口(return)
樹狀結構的遍歷
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)
二分法
掐頭結尾取中間
查找效率非常的高
不使用遞歸進行二分法
lst = [1,3,5,7,12,36,68,79,132,345,567] 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("不存在")
用遞歸進行二分法的兩種方法
1)第一種
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,54,68,79,85,92,106])
2)第二種
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 False n = int(input("請輸入你要查找的數:")) lst = lst = [1,3,5,7,12,36,68,79,125,343,485,875,1948] ret = func(n, lst, 0, len(lst)-1) print(ret)