python遞歸函數及二分法查找

函數的遞歸: 在一個函數的內部調用本身python

複製代碼
 1 死循環: 能夠無限循環,不會中止
 2 while True:
 3     print('我不是遞歸')
 4  
 5 遞歸: 不是死循環,有最大循環深度
 6 def story():
 7     print('我是遞歸')
 8     story()
 9 story()
10 超過了遞歸的最大深度報錯
11 RecursionError: maximum recursion depth exceeded while calling a Python object
複製代碼

官網上 源碼中設置的遞歸深度: 1000
本身實際測試遞歸深度: 998app

複製代碼
 1 n = 0
 2 def func():
 3     global n
 4     n += 1
 5     print(n)
 6     func()
 7 func()
 8 import sys
 9 print(sys.getrecursionlimit())    #查看遞歸的最大深度
10 
11 若是你的遞歸每次都要超過限制 不適合用遞歸來解決
12 爲何要有限制? 內存消耗的保護機制
13 設置遞歸的最大深度
14 import sys
15 sys.setrecursionlimit(1000000)
16 
17 n = 0
18 def func():
19     global n
20     n += 1
21     print(n)
22     func()
23 func()
複製代碼

總結
1.遞歸函數的定義 :一個函數在執行的過程當中調用了本身
2.遞歸在python中的最大深度 : 1000/998
3.遞歸的最大深度是能夠本身修改的,可是不建議你修改函數

複製代碼
 1 案例(遍歷樹形結構)
 2 import os
 3 def func(lujing,n):
 4     lst = os.listdir(lujing)    #打開文件夾,列出該文件夾中的全部文件及目錄
 5     for i in lst:               #循環文件夾中的全部名字,i至關於文件名
 6         path = os.path.join(lujing,i)   #拼接循環的文件名路徑
 7         # print(path)
 8         if os.path.isdir(path): #判斷拼接後的路徑是不是目錄
 9             print('\t'*n,i)       #若是是目錄就打印,n等於幾就是幾個tab鍵分隔
10             func(path,n+1)          #而後再次調用本身,在重複上面的操做,
11         else:
12             print('\t'*n,i)       #若是不是目錄,就打印文件名
13 func('E:/test/',0)  #0爲分層間隔
複製代碼

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

複製代碼
 1 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]
 2 print(len(lst))
 3 n = int(input('<<<<:'))
 4 start = 0
 5 end = len(lst) -1
 6 count = 0
 7 while start <= end:
 8     mid = (start + end) // 2
 9     count+= 1
10     if n > lst[mid]:
11         start = mid +1
12     elif n < lst[mid]:
13         end = mid -1
14     else:
15         print('存在')
16         break
17 else:
18     print('不存在')
19 print('查找了%s次'%count)
20 
21 方法2
22 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]
23 def func(n,lst):
24     start = 0
25     end = len(lst) -1
26     # count = 0
27     if lst != []:
28         mid = (start + end) //2
29         if n > lst[mid]:
30             func(n,lst[mid+1:])
31         elif n < lst[mid]:
32             func(n,lst[:mid])
33         else:
34             print('存在')
35             return
36     else:
37         print('不存在')
38         return
39 n = int(input('<<<:'))
40 func(n,lst)
41 
42 方法3
43 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]
44 def func(n,lst,start,end):
45     if start <= end:
46         mid = (start + end) //2
47         if n > lst[mid]:
48             start = mid + 1
49             return func(n,lst,start,end)
50         elif n < lst[mid]:
51             end = mid - 1
52             return func(n,lst,start,end)
53         else:
54             print('找到了')
55             return mid
56     else:
57         print('找不到')
58         return -1
59 n = int(input('<<:'))
60 ret = func(n,lst,0,len(lst)-1)
61 print(ret)
62 
63 #最快的查找
64 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]
65 new_lst = []
66 for i in range(88):
67     new_lst.append(0)
68 for i in lst:
69     new_lst[i] = 1
70 print(new_lst)
71 i = int(input('<<<:'))
72 if new_lst[i] == 0:
73     print('存在')
74 else:
75     print('不存在')
複製代碼

 

 

 

 

 

 

 

 

 

# me : yuan 比我大2歲
# yuan : wusir 比我大2歲
# wusir : 寶元 比wusir大2歲
# 寶元 : alex比寶元大2歲

# me,yuan,wusir,寶元,alex
# alex 18
# 我多大?

# n = 1,age = q(n+1) -2
# n = 2,age = q(n+1) -2
# n = 3,age = q(n+1) -2
# n = 4,age = q(n+1) -2
# n = 5,age = 18

def q(n):
    if n == 1:
        age = q(n + 1) - 2
        return age
    elif n == 2:
        age = q(n + 1) - 2
        return age
    elif n == 3:
        age = q(n + 1) - 2
        return age
    elif n == 4:
        age = q(n + 1) - 2
        return age
    elif n == 5:
        return 18
ret = q(1)
print(ret)

# return 可以幫助你中止遞歸,而且把最內層的結果一層一層的返回到最外層
# 在最內層函數的返回值,返回的時候永遠是離最內層最近的上一層才能接收到返回值
執行過程:
def q(1):   #3 q(1)  #6 q(2)  #9 q(3)  #12 q(4)  #15 q(5)
    if 1 == 1:      #4 n等於1
        age = 12 - 2  #5 此時q(1+1)等於2等於q(n)
        return 10              #21 q(2-1),返回值等於12-2=10

def q(2):
    elif 2 == 2:    #7 符合條件
        age = 14 - 2  #8 q(2+1)等於3等於q(n),返回給q(n)
        return 12              #20 q(3-1),返回值等於14-2=12

def q(3):
    elif n == 3:            #10  符合條件
        age = 16 - 2  #11 q(3+1)等於4等於q(n),返回給q(n)
        return 14              #19 q(4-1),返回值等於16-2=14

def q(4):
    elif n == 4:            #13 符合條件
        age = 16     #14 q(4+1)等於5等於q(n),返回給q(n)
        return age              #18 q(5-1),返回值等於18-2=16

def q(5):
    elif n == 5:            #16 符合條件
        return 18               #17 返回值爲18

#def q(n):
#    if n < 5:
#        age = q(n + 1) - 2
#        return age
#    elif n == 5:
#        return 18
ret = q(1)  #2      #由於這個獲取的是q(1)的返回值,而q(1)返回值爲10=ret獲取返回值10
print(ret)  #打印ret返回值spa

相關文章
相關標籤/搜索