1. 程式人生 > >python之路--遞迴, 二分法

python之路--遞迴, 二分法

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)