遞歸函數&二分查找

1、遞歸函數

1)定義

  • 在函數中調用函數自己,就是遞歸
  • 在python中遞歸的深度最大爲1000,但實際達不到1000
def func():
    print("-----func-----")
    func()

func()

2)應用

  • 能夠使用遞歸來遍歷各類樹形結構,好比文件夾系統:能夠使用遞歸來遍歷該文件夾中的全部文件
import os


def func(filepath, n):
    files_list = os.listdir(filepath)  # 獲取當前文件夾中的全部文件
    for file in files_list:
        file_d = os.path.join(filepath, file)  # 拼接文件的真實路徑
        if os.path.isdir(file_d):  # 遞納入口  判斷文件是否爲文件夾
            print("\t"*n, file)
            func(file_d, n+1)  #
        else:
            print("\t"*n, file)  # 遞歸出口

2、二分查找

  • 優勢:每次可以除掉一半的數據,查找效率高
  • 要求:查找的序列必須是有序序列

1) 非遞歸算法

a) 利用索引

# 讓用戶輸入一個數n. 判斷這個n是否出如今lst中
lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963]

left = 0
right = len(lst) - 1

num = int(input("請輸入一個數n:"))
while left <= right:
    mid = (left + right) // 2
    if lst[mid] > num:
        right = mid - 1
    elif lst[mid] < num:
        left = mid + 1
    else:
        print("這個數在lst中")
        break
else:
    print("這個數不在lst中")

2) 遞歸算法

a) 利用索引

# 讓用戶輸入一個數n. 判斷這個n是否出如今lst中
lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963]


def binary_search(lst, num, left, right):
    if left > right:
        return False
    mid = (left + right) // 2
    if lst[mid] > num:
        right = mid - 1
        return binary_search(lst, num, left, right)
    elif lst[mid] < num:
        left = mid + 1
        return binary_search(lst, num, left, right)
    else:return True

num = int(input("請輸入一個數n:"))
ret = binary_search(lst, num, 0, len(lst)-1)
print(ret)

b) 切換列表

# 讓用戶輸入一個數n. 判斷這個n是否出如今lst中
lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963]


def binary_search(lst, num):
    if len(lst) == 0:
        return False
    mid = (len(lst) - 1) // 2
    if num > lst[mid]:
        return binary_search(lst[mid+1:], num)
    elif num < lst[mid]:
        return binary_search(lst[:mid], num)
    else:
        print("這個數在lst中")
        return True


num = int(input("請輸入一個數n:"))

ret = binary_search(lst, num)
print(ret)
相關文章
相關標籤/搜索