1. 程式人生 > >Python基礎14_遞迴函式,二分查詢

Python基礎14_遞迴函式,二分查詢

 一. 遞迴
    在函式中呼叫函式本身, 就是遞迴
    prthon中遞迴的最大深度是998
        def func(n):
            print(n)
            n += 1
            func(n)
        func(1)
    遞迴的應用:我們可以使用遞迴來遍歷各種樹形結構, 比如我們的資料夾系統, 可以使用遞迴來遍歷該資料夾中的所有檔案
        import os

        def func(lujing, n):
        lst = os.listdir(lujing)                # os.listdir() 開啟資料夾, 把該資料夾內所有的檔名裝到列表lst
        for el in lst:                          # 遍歷列表, 拿到每一個檔名
            path = os.path.join(lujing, el)     # 還原 檔名 的 路徑
            # path = lujing + "\\" + el
            # print(path)
            if os.path.isdir(path):             # 判斷該路徑下的檔案是否是 資料夾
                print("\t" * n, el)             # 列印檔名
                func(path, n+1)                 # 如果是資料夾, 再次 執行func函式, 開啟該資料夾
            else:
                print("\t" * n, el)         # 如果不是資料夾, 直接列印檔名
        func("d:\紅蜘蛛", 0)
二. 二分查詢
    每次查詢能刪除一般的資料, 查詢效率很高, 但是侷限性比較大, 必須是有序序列才可以使用二分查詢
    1. 普通二分法查詢
        lst = [3, 15, 26, 37, 48, 59, 61, 76, 89, 92]
        def binarysearch(n, lst):
            min = 0
            max = len(lst) - 1
            while min <= max:
                mid = (min + max) // 2
                if n > lst[mid]:
                    min = mid + 1
                elif n < lst[mid]:
                    max = mid - 1
                else:
                    return mid
            else:
                return -1
        num = int(input("請輸入一個數:"))
        f = binarysearch(num, lst)
        print(f)

    2. 另類遞迴的二分法, 很難計算出索引, 列表在變,用切片來切列表
        lst = [3, 15, 26, 37, 48, 59, 61, 76, 89, 92]
        def binarysearch(n, lst):
            min = 0
            max = len(lst) - 1
            mid = (min + max) // 2
            while lst != []:
                if n > lst[mid]:
                    lst = lst[mid + 1 :]
                    return binarysearch(n, lst)
                elif n < lst[mid]:
                    lst = lst[: mid]                    # 左閉右開
                    return binarysearch(n, lst)
                else:
                    print("存在")
                    break
            else:
                print("不存在")
        num = int(input("請輸入要查詢的數字:"))
        binarysearch(num, lst)
    3. 普通遞迴二分法, 計算思想和二分法一致
        lst = [3, 15, 26, 37, 48, 59, 61, 76, 89, 92]
        def binarysearch(n, lst, min, max):
            mid = (min + max) // 2
            if min <= max:
                if n > lst[mid]:
                    min = mid + 1
                    return binarysearch(n, lst, min, max)
                elif n < lst[mid]:
                    max = mid - 1
                    return binarysearch(n, lst, min, max)
                else:
                    return mid
            else:
                return -1
        num = int(input("請輸入要查詢的數:"))
        f = binarysearch(num, lst, 0, len(lst) - 1)
        print(f)
    4. 一種特殊的查詢方法
        已知列表中的最大數值, 查詢某個數是否存在
        lst = [3, 15, 26, 37, 48, 59, 61, 76, 89, 92]
        def func():
        while 1:
            n = int(input("請輸入要查詢的數字:"))
            if n <= 92 and n >= -93:
                new_list = []
                for i in range(93):
                    new_list.append(0)
                for i in range(len(lst)):
                    new_list[lst[i]] = 1
                if new_list[n] == 1:
                    print("存在")
                else:
                    print("不存在")
            else:
                print("輸入有誤")
                continue
        func()