1. 程式人生 > >python遞歸函數及二分法查找

python遞歸函數及二分法查找

打印 code 最快 for 二分法查找 new 過程 python one

函數的遞歸: 在一個函數的內部調用自己

死循環: 可以無限循環,不會停止
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(不存在)

python遞歸函數及二分法查找