函數的遞歸: 在一個函數的內部調用本身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