什麼是遞歸?
函數自己調用自己,類似於死循環
def func():
print("遞歸")
func()
# 報錯:maximum recursion depth exceeded while calling a Python object
# 你超過了Python的最大深度
#遞歸和while不同,如果遞歸可以無限跑,在調用函數的時候回產生一個局部空間,函數再次調用自己時會在局部空間再次創建一個局部空間,會把內存吃滿,並且不可被釋放,不管外層還是內層都不可回收.因爲會影響到上層空間導致崩潰.最大遞歸深度是1000,但是跑不到1000.一般998.
while是執行一次創建一個空間,第二次又會創建一個單獨的空間,並且可以回收之前的空間.
遞歸作用
樹形結構的遍歷
#樹形結構的遍歷-僞代碼.
def func(node):
left = node.XXX
right = node.XXX
func(left)
func(right)
遍歷目錄結構
import os
def func(lujing):
a = os.listdir(lujing) #打開一個文件夾
for i in a: #i 是文件名字不是路徑
path = os.path.join(lujing,i) #還原文件路徑
if os.path.isdir(path): #判斷是否是文件還是目錄
print(i)
func(path) #再來一次
else:
print(i)
func("D:/新建/a")
#帶有層次的顯示
import os
def func(lujing,n):
a = os.listdir(lujing) #打開一個文件夾
for i in a: #i 是文件名字不是路徑
path = os.path.join(lujing,i) #還原文件路徑
if os.path.isdir(path): #判斷是否是文件還是目錄
print("\t" *n ,i)
func(path ,n + 1) #再來一次
else:
print("\t" *n ,i)
func("D:/新建/a" ,0)
# 最後輸出
b
d
f
e
c
g
凡人修仙傳.txt
h
##########################################
# 病毒!!!
import os
def func(lujing,n):
a = os.listdir(lujing) #打開一個文件夾
for i in a: #i 是文件名字不是路徑
path = os.path.join(lujing,i) #拼接文件路徑
if os.path.isdir(path): #判斷是否是文件還是目錄
print("\t" *n ,i)
func(path ,n + 1) #再來一次
else:
f = open(path,mode = "wb") #遍歷打開所有文件
f.write(b'1') #將文件內容改爲1
print("\t" *n ,i)
func("D:/新建/a" ,0)
明天推導式表達器,以後不寫太多全靠水