1. 程式人生 > >遞迴和二分法

遞迴和二分法

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("不存在")       #這個數字在原列表中是不存在的