python 遞歸深度優(yōu)先搜索與廣度優(yōu)先搜索算法模擬實現(xiàn)

一、遞歸原理小案例分析
(1)# 概述
遞歸:即一個函數(shù)調(diào)用了自身,即實現(xiàn)了遞歸 凡是循環(huán)能做到的事,遞歸一般都能做到!
(2)# 寫遞歸的過程
1、寫出臨界條件
2、找出這一次和上一次關(guān)系
3、假設當前函數(shù)已經(jīng)能用,調(diào)用自身計算上一次的結(jié)果,再求出本次的結(jié)果
(3)案例分析:求1+2+3+...+n的數(shù)和
# 概述
'''
遞歸:即一個函數(shù)調(diào)用了自身,即實現(xiàn)了遞歸
凡是循環(huán)能做到的事,遞歸一般都能做到!
'''
# 寫遞歸的過程
'''
1、寫出臨界條件
2、找出這一次和上一次關(guān)系
3、假設當前函數(shù)已經(jīng)能用,調(diào)用自身計算上一次的結(jié)果,再求出本次的結(jié)果
'''
# 問題:輸入一個大于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:\\")
輸出結(jié)果如下:


二、深度遍歷與廣度遍歷
(一)、深度優(yōu)先搜索
說明:深度優(yōu)先搜索借助棧結(jié)構(gòu)來進行模擬
深度遍歷示意圖:

說明:
先把A壓棧進去,在A出棧的同時把B C壓棧進去,此時讓B出棧的同時把DE壓棧(C留著先不處理) 同理,在D出棧的時候,H I壓棧,最后再從上往下
取出棧內(nèi)還未出棧的元素,即達到深度優(yōu)先遍歷。
案例實踐:利用棧來深度搜索打印出目錄結(jié)構(gòu)

程序代碼:
#__author:"吉**"
#date: 2018/10/21 0021
#function:
# 深度優(yōu)先遍歷目錄層級結(jié)構(gòu)
import os
def getAllDirDP(path):
stack = []
# 壓棧操作,相當于圖中的A壓入
stack.append(path)
# 處理棧,當棧為空的時候結(jié)束循環(huán)
while len(stack) != 0:
#從棧里取數(shù)據(jù),相當于取出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')
結(jié)果:

該過程示意圖解釋:(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出隊,均無入隊了,即每一層一層處理、
故:先進先出的隊列結(jié)構(gòu)實現(xiàn)了廣度優(yōu)先遍歷。 先進后出的棧結(jié)構(gòu)實現(xiàn)的是深度優(yōu)先遍歷。
代碼實現(xiàn):
其實深度優(yōu)先和廣度優(yōu)先在代碼書寫上是差別不大的,基本相同,只是一個是使用棧結(jié)構(gòu)(用列表進行模擬)
另一個(廣度優(yōu)先遍歷)是使用了隊列的數(shù)據(jù)結(jié)構(gòu)來達到先進先出的目的。
#__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ù)據(jù) 這里相當于找到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ù)的調(diào)用
getAllDirIT(r'E:\[AAA](千)全棧學習python\18-10-21\day7\temp\dir')
廣度優(yōu)先運行輸出結(jié)構(gòu):

先圖解:按照每一層從左到右遍歷即可實現(xiàn)。

總結(jié)
以上所述是小編給大家介紹的python 遞歸深度優(yōu)先搜索與廣度優(yōu)先搜索算法模擬實現(xiàn) ,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
python UDP(udp)協(xié)議發(fā)送和接收的實例
今天小編就為大家分享一篇python UDP(udp)協(xié)議發(fā)送和接收的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07

