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