Python自學之路:遞迴、棧和佇列遍歷目錄

wcq829928發表於2018-09-22

遞迴呼叫的概念:一個函式呼叫了自身,稱為遞迴呼叫
遞迴函式的概念:一個能夠被自身呼叫的函式稱為遞迴函式

遞迴一般執行的是迴圈邏輯

編寫遞迴函式的方法:
1、找出臨界條件,比如最小值,最大值等等
2、找出這一次和上一次的關係
3、假設當前函式已經能用,呼叫自身計算上一次結果,再求出本次的結果

一個簡單的遞迴函式:
def sum(n):
if n==1:#這個就是臨街條件
return 1
else:
return n + sum(n-1) #這一次和上一次的關係

棧:先進後出的方式存取資料
佇列:先進先出的方式存取資料
用列表模仿棧:
#定義一個列表
stack =[]

#壓棧
stack.append(‘A’)
#出棧
data = stack.pop()

#佇列操作
import collections

#建立一個佇列
queue = collections. deque()
#進隊
queue.append(‘A’)
#出隊
data = queue.popleft()

#遞迴的方式遍歷目錄
import os
def getAllDir(path):
#獲取當前目錄下的所有檔案
filesList = os.listdir(path)
#處理每一個檔案
for fileName in filesList:
#判斷是否是路徑(絕對路徑)
absPath = os.path.join(path, fileName)
if os.path.isdir(absPath):
#是路徑就呼叫自身
getAllDir(absPath)
else:
#作為普通檔案處理

#用棧的方式遍歷目錄(深度遍歷)
import os
def getAllDirDE(path):
#定義一個空棧
stack = []
#把當前目錄壓棧
stack.append(path)
#處理棧,當棧為空就結束程式
while len(stack) !=0:
#出棧
dirPath = stack.pop()
#目錄下所有檔案
fileList = os.listdir(dirPath)
#處理每一個檔案
for fileName in fileList:
#獲取此檔案的絕對路徑
fileAbsPath = os.path.join(dirPath, fileName)
#判斷是否為目錄
if os.path.isdir(fileAbsPath):
#壓棧
stack.append(fileAbsPath)
else:
#作為普通檔案處理

#佇列方式遍歷目錄(廣度遍歷)
import os
import collections

def getAllDirQU(path):
#建立一個佇列
queue = collections.deque()
#進隊
queue.append(path)

while len(queue) !=0:
	#出隊
	dirPath = queue.popleft()
	#目錄下所有檔案
	fileList = os.listdir(dirPath)
	#處理每一個檔案
	for fileName in fileList:
		#獲取絕對路徑
		fileAbsPath = os.path.join(dirPath, fileName)
		#判斷是否是目錄
		if os.path.isdir(fileAbsPath):
			queue.append(fileAbsPath)
		else:
			#作為普通檔案處理

相關文章