1. 程式人生 > >python遞迴函式及二分法查詢

python遞迴函式及二分法查詢

函式的遞迴: 在一個函式的內部呼叫自己

死迴圈: 可以無限迴圈,不會停止
while True:
    print('我不是遞迴')
 
遞迴: 不是死迴圈,有最大迴圈深度
def story():
    print('我是遞迴')
    story()
story()
超過了遞迴的最大深度報錯
RecursionError: maximum recursion depth exceeded while calling a Python object

官網上 原始碼中設定的遞迴深度: 1000
自己實際測試遞迴深度: 998

n = 0
def func():
    global
n n += 1 print(n) func() func() import sys print(sys.getrecursionlimit()) #檢視遞迴的最大深度 如果你的遞迴每次都要超過限制 不適合用遞迴來解決 為什麼要有限制? 記憶體消耗的保護機制 設定遞迴的最大深度 import sys sys.setrecursionlimit(1000000) n = 0 def func(): global n n += 1 print(n) func() func()

總結
1.遞迴函式的定義 :一個函式在執行的過程中呼叫了自己
2.遞迴在python中的最大深度 : 1000/998
3.遞迴的最大深度是可以自己修改的,但是不建議你修改

案例(遍歷樹形結構)
import os
def func(lujing,n):
    lst = os.listdir(lujing)    #開啟資料夾,列出該資料夾中的所有檔案及目錄
    for i in lst:               #迴圈資料夾中的所有名字,i相當於檔名
        path = os.path.join(lujing,i)   #拼接迴圈的檔名路徑
        # print(path)
        if os.path.isdir(path): #判斷拼接後的路徑是否是目錄
            print('\t'*n,i)       #
如果是目錄就列印,n等於幾就是幾個tab鍵分隔 func(path,n+1) #然後再次呼叫自己,在重複上面的操作, else: print('\t'*n,i) #如果不是目錄,就列印檔名 func('E:/test/',0) #0為分層間隔

二分法查詢主要的作用就是查詢元素
資料規則: 掐頭結尾取中間,必須是有序序列,資料量越大,效率約明顯(百萬級資料集)

lst = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
print(len(lst))
n = int(input('<<<<:'))
start = 0
end = len(lst) -1
count = 0
while start <= end:
    mid = (start + end) // 2
    count+= 1
    if n > lst[mid]:
        start = mid +1
    elif n < lst[mid]:
        end = mid -1
    else:
        print('存在')
        break
else:
    print('不存在')
print('查找了%s次'%count)

方法2
lst = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def func(n,lst):
    start = 0
    end = len(lst) -1
    # count = 0
    if lst != []:
        mid = (start + end) //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,lst)

方法3
lst = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def func(n,lst,start,end):
    if start <= end:
        mid = (start + end) //2
        if n > lst[mid]:
            start = mid + 1
            return func(n,lst,start,end)
        elif n < lst[mid]:
            end = mid - 1
            return func(n,lst,start,end)
        else:
            print('找到了')
            return mid
    else:
        print('找不到')
        return -1
n = int(input('<<:'))
ret = func(n,lst,0,len(lst)-1)
print(ret)

#最快的查詢
lst = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
new_lst = []
for i in range(88):
    new_lst.append(0)
for i in lst:
    new_lst[i] = 1
print(new_lst)
i = int(input('<<<:'))
if new_lst[i] == 0:
    print('存在')
else:
    print('不存在')