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()