python 遞歸深度優(yōu)先搜索與廣度優(yōu)先搜索算法模擬實現(xiàn)
一、遞歸原理小案例分析
(1)# 概述
遞歸:即一個函數(shù)調用了自身,即實現(xiàn)了遞歸 凡是循環(huán)能做到的事,遞歸一般都能做到!
(2)# 寫遞歸的過程
1、寫出臨界條件
2、找出這一次和上一次關系
3、假設當前函數(shù)已經能用,調用自身計算上一次的結果,再求出本次的結果
(3)案例分析:求1+2+3+...+n的數(shù)和
# 概述 ''' 遞歸:即一個函數(shù)調用了自身,即實現(xiàn)了遞歸 凡是循環(huán)能做到的事,遞歸一般都能做到! ''' # 寫遞歸的過程 ''' 1、寫出臨界條件 2、找出這一次和上一次關系 3、假設當前函數(shù)已經能用,調用自身計算上一次的結果,再求出本次的結果 ''' # 問題:輸入一個大于1 的數(shù),求1+2+3+.... def sum(n): if n==1: return 1 else: return n+sum(n-1) n=input("請輸入:") print("輸出的和是:",sum(int(n))) ''' 輸出: 請輸入:4 輸出的和是: 10 '''
#__author:"吉*佳" #date: 2018/10/21 0021 #function: import os def getAllDir(path): fileList = os.listdir(path) print(fileList) for fileName in fileList: fileAbsPath = os.path.join(path,fileName) if os.path.isdir(fileAbsPath): print("$$目錄$$:",fileName) getAllDir(fileAbsPath) else: print("**普通文件!**",fileName) # print(fileList) pass getAllDir("G:\\")
輸出結果如下:
二、深度遍歷與廣度遍歷
(一)、深度優(yōu)先搜索
說明:深度優(yōu)先搜索借助棧結構來進行模擬
深度遍歷示意圖:
說明:
先把A壓棧進去,在A出棧的同時把B C壓棧進去,此時讓B出棧的同時把DE壓棧(C留著先不處理) 同理,在D出棧的時候,H I壓棧,最后再從上往下
取出棧內還未出棧的元素,即達到深度優(yōu)先遍歷。
案例實踐:利用棧來深度搜索打印出目錄結構
程序代碼:
#__author:"吉**" #date: 2018/10/21 0021 #function: # 深度優(yōu)先遍歷目錄層級結構 import os def getAllDirDP(path): stack = [] # 壓棧操作,相當于圖中的A壓入 stack.append(path) # 處理棧,當棧為空的時候結束循環(huán) while len(stack) != 0: #從棧里取數(shù)據,相當于取出A,取出A的同時把BC壓入 dirPath = stack.pop() firstList = os.listdir(dirPath) #判斷:是目錄壓棧,把該目錄地址壓棧,不是目錄即是普通文件,打印 for filename in firstList: fileAbsPath=os.path.join(dirPath,filename) if os.path.isdir(fileAbsPath): #是目錄就壓棧 print("目錄:",filename) stack.append(fileAbsPath) else: #是普通文件就打印即可,不壓棧 print("普通文件:",filename) getAllDirDP(r'E:\[AAA](千)全棧學習python\18-10-21\day7\temp\dir')
結果:
該過程示意圖解釋:(s-05-1部分)
原理分析:
說明:
隊列是 先進先出的模型。A先進隊,在A出隊的時候,C B入隊,按圖示,C出隊,F(xiàn)G 入隊,B出隊,DE入隊,
F出隊,JK入隊,G出隊,無入隊,D出隊,H I入隊,最后E J K H I出隊,均無入隊了,即每一層一層處理、
故:先進先出的隊列結構實現(xiàn)了廣度優(yōu)先遍歷。 先進后出的棧結構實現(xiàn)的是深度優(yōu)先遍歷。
代碼實現(xiàn):
其實深度優(yōu)先和廣度優(yōu)先在代碼書寫上是差別不大的,基本相同,只是一個是使用棧結構(用列表進行模擬)
另一個(廣度優(yōu)先遍歷)是使用了隊列的數(shù)據結構來達到先進先出的目的。
#__author:"吉**" #date: 2018/10/21 0021 #function: # 廣度優(yōu)先搜索模擬 # 利用隊列來模擬廣度優(yōu)先搜索 import os import collections def getAllDirIT(path): queue=collections.deque() #進隊 queue.append(path) #循環(huán),當隊列為空,停止循環(huán) while len(queue) != 0: #出隊數(shù)據 這里相當于找到A元素的絕對路徑 dirPath = queue.popleft() # 找出跟目錄下的所有的子目錄信息,或者是跟目錄下的文件信息 dirList = os.listdir(dirPath) #遍歷該文件夾下的其他信息 for filename in dirList: #絕對路徑 dirAbsPath = os.path.join(dirPath,filename) # 判斷:如果是目錄dir入隊操作,如果不是dir打印出即可 if os.path.isdir(dirAbsPath): print("目錄:"+filename) queue.append(dirAbsPath) else: print("普通文件:"+filename) # 函數(shù)的調用 getAllDirIT(r'E:\[AAA](千)全棧學習python\18-10-21\day7\temp\dir')
廣度優(yōu)先運行輸出結構:
先圖解:按照每一層從左到右遍歷即可實現(xiàn)。
總結
以上所述是小編給大家介紹的python 遞歸深度優(yōu)先搜索與廣度優(yōu)先搜索算法模擬實現(xiàn) ,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
相關文章
python tkinter圖形界面代碼統(tǒng)計工具(更新)
這篇文章主要為大家詳細介紹了python tkinter圖形界面代碼統(tǒng)計工具,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-09-09Python實現(xiàn)讀取mat、tif和hdr格式數(shù)據
遙感影像數(shù)據大多以tif格式或者以hdr格式進行存儲,如果以mat格式進行存儲,不會保留坐標信息,本文將詳細介紹如何使用python來讀取這三種格式的數(shù)據,需要的可以參考下2023-12-12