遞迴和二分法
阿新 • • 發佈:2018-12-13
1. 遞迴
自己呼叫自己
遞迴的重點是 入口(引數) 和 出口(return)
樹形結構的遍歷
遍歷f盤裡所有的檔案和資料夾
import os def func(lujing,n): lis = os.listdir(lujing) for i in lis : a = os.path.join(lujing,i) if os.path.isdir(a) : print("..."* n + i) func(a,n+1) else : print("..."* n + i) func("f:/",0)
2. 二分法
掐頭結尾取中間
查詢效率非常的高 且必須是有序的
lis = [1,65,3,2,1,95,63,8942] lis1 = list(sorted(lis,key = lambda i:i)) n = int(input("請輸入你要查詢的數字:")) left = 0 right = len(lis)- 1 while left <= right : mid = (left+right)// 2 if n > lis1[mid] : left = mid + 1 elif n < lis1[mid] : right = mid - 1 else : print("存在的") break else : print("不存在")
##遞迴查詢 遞迴時對列表進行切邊 必須是有序的
lis = [1,65,3,2,1,95,63,8942]
lis = [1,65,3,2,1,95,63,8942] def func(x,lis1) : if lis1 != [] : left = 0 right = len(lis1)-1 mid = (left+right)//2 if x > lis1[mid] : del lis1[:mid+1] func(x,lis1) elif x < lis1[mid] : del lis1[mid:] func(x,lis1) else : print("存在") else : print("不存在") n = int(input("請輸入你要查詢的數字:")) lis2 = list(sorted(lis,key = lambda i:i)) func(n,lis2)
###遞迴查詢 遞迴時,改變列表的索引,用二分法查詢.必須是有序的
lis = [1,65,3,2,1,95,63,8942]
lis = [1,65,3,2,1,95,63,8942] def func(x,lst,left,right): if left <= right : mid = (left+right)//2 if x > lst[mid] : left = mid +1 func(x,lst,left,right) elif x < lst[mid] : right = mid - 1 func(x,lst,left,right) else : print("存在") else : print("不存在") n = int(input("請輸入你要查詢的數字:")) lis2 = list(sorted(lis,key = lambda i:i)) func(n,lis2,0,len(lis2)-1)
查詢運算最快的方法 這個可以是無序的
lis = [1,65,3,2,1,95,63,8942] #先找出這個數列的最大值 lis1 = [] #建立一個空的列表 for i in range(8942+1): #對原列表的最大值進行range遍歷 lis1.append(0) #每一次遍歷都對新列表新增一個元素 for i in lis : #對原列表進行編列 lis1[i] = 1 #把新列表的第i項元素,修改一個值(把原列表的每個元素當成新列表的索引,賦予一個新值) n = int(input("請輸入你要查詢的數字:")) #輸入要查詢的數字 if lis1[n] == 1 : #把這個數字當成新列表的索引,看看這個索引對應的值是否為新賦予的值,如果是 print("存在") #那這個數字在原列表中是存在的 else : #這個數字當成的新列表的索引,這個索引所對應的值不是新賦予的值的話, print("不存在") #這個數字在原列表中是不存在的