不斷的對於某操作重覆調用執行稱為遞歸調用,遞歸函數執行的這個過程中只有進棧(開闢空間),沒有出棧,直到最後一次調用完畢了,才逐個出棧,所以遞歸函數在執行的時候非常的占用記憶體資源;如果執行的次數過多了,會產生記憶體溢出的現象;所以一定要控制遞歸的層數,當符合某一條件時要終止遞歸調用,幾乎所有的遞歸都能用 ...
不斷的對於某操作重覆調用執行稱為遞歸調用,遞歸函數執行的這個過程中只有進棧(開闢空間),沒有出棧,直到最後一次調用完畢了,才逐個出棧,所以遞歸函數在執行的時候非常的占用記憶體資源;如果執行的次數過多了,會產生記憶體溢出的現象;所以一定要控制遞歸的層數,當符合某一條件時要終止遞歸調用,幾乎所有的遞歸都能用while迴圈來代替;所以對於遞歸要慎用!!!
遞歸函數:在某個函數中,調用其本身(函數自己調用自己),這個函數整體我們稱為遞歸函數。
如何定義遞歸函數?(先假設此函數已經實現)
考慮切入點:(1).尋找一個臨界點(結束點);(2).本次的函數執行不能滿足最終的整體需求,所以還需要再次的去調用此函數;(找到後者和前者之間的關係,體現:後者的調用結束會將前者需要的數據返回回來)
優點:遞歸可以把問題簡單化,讓思路使為清淅,代碼更簡潔。缺點:遞歸因系統環境影響大,當遞歸深度太大時,可能會得到不可預知的結果。
演示遞歸函數調用自身:
1 # 直接調用自身: 2 def f(): 3 f() 4 5 f()
1 # 間接調用自身: 2 def fa(): 3 fb() 4 def fb(): 5 fa() 6 7 fa()
代碼演示示例:
1 # 遞歸求和:0 + 1 + 2 + 3 + 4 + ..... + n 的和 2 def mysum(n): 3 if n == 0: 4 return 0 5 return n + mysum(n-1) 6 7 print(mysum(100)) # 5050 8 print(mysum(998)) # 沒錯 ,是臨界點,再大就會溢出 9 print(mysum(1000)) # 程式崩潰(遞歸的弊端) 10 11 12 # 計算1~5的階乘 13 def jiechen(num): 14 if num == 1: 15 return 1 16 return num * jiechen(num - 1) 17 18 print(jiechen(5)) 19 20 21 # 遍歷某個路徑下麵的所有內容(文件和目錄,考慮多級的情況) 22 import os 23 # 自定義函數(遞歸函數):遍歷目錄層級(多層) 24 def printDirs(path): 25 dirs = os.listdir(path) 26 # 迴圈處理此列表 27 for d in dirs: 28 # 組裝d得到其絕對路徑形式 29 fileAbsPath = os.path.join(path,d) 30 # 判斷是目錄還是文件 31 # 如果是文件直接列印即可,如果是目錄列印完畢後再次調用此函數 32 if os.path.isfile(fileAbsPath): 33 print(d) 34 elif os.path.isdir(fileAbsPath): 35 print(d) 36 printDirs(fileAbsPath) 37 path = r'C:\Users\Administrator\Desktop\a' 38 printDirs(path)