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ò)程示意圖解釋?zhuān)海╯-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)文章
Django框架自定義模型管理器與元選項(xiàng)用法分析
這篇文章主要介紹了Django框架自定義模型管理器與元選項(xiàng)用法,結(jié)合實(shí)例形式分析了自定義模型管理器與元選項(xiàng)的功能、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-07-07
python UDP(udp)協(xié)議發(fā)送和接收的實(shí)例
今天小編就為大家分享一篇python UDP(udp)協(xié)議發(fā)送和接收的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
python爬蟲(chóng)獲取淘寶天貓商品詳細(xì)參數(shù)
這篇文章主要為大家詳細(xì)介紹了python爬蟲(chóng)獲取淘寶天貓商品詳細(xì)參數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
Python Web程序部署到Ubuntu服務(wù)器上的方法
在本文記錄了我在Ubuntu中部署Flask Web站點(diǎn)的過(guò)程, 其中包括用戶創(chuàng)建、代碼獲取、Python3環(huán)境的安裝、虛擬環(huán)境設(shè)置、uWSGI啟動(dòng)程序設(shè)置,并將Nginx作為前端反向代理,需要的朋友參考下吧2018-02-02
Python實(shí)現(xiàn)CART決策樹(shù)算法及詳細(xì)注釋
CART算法是一種樹(shù)構(gòu)建算法,既可以用于分類(lèi)任務(wù),又可以用于回歸,本文僅討論基本的CART分類(lèi)決策樹(shù)構(gòu)建,不討論回歸樹(shù)和剪枝等問(wèn)題,感興趣的朋友跟隨小編一起看看吧2021-10-10
python之pymysql模塊簡(jiǎn)單應(yīng)用示例代碼
這篇文章主要介紹了python之pymysql模塊簡(jiǎn)單應(yīng)用示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
使用Python模擬操作windows應(yīng)用窗口詳解
在日常工作中,我們經(jīng)常遇到需要進(jìn)行大量重復(fù)性任務(wù)的情況,這篇文章將介紹如何使用 Python 模擬操作記事本,感興趣的小伙伴可以了解下2025-02-02
Python中的異常處理相關(guān)語(yǔ)句基礎(chǔ)學(xué)習(xí)筆記
這里我們簡(jiǎn)單整理一下Python中的異常處理相關(guān)語(yǔ)句基礎(chǔ)學(xué)習(xí)筆記,包括try...except與assert等基本語(yǔ)句的用法講解:2016-07-07
淺析Python pandas模塊輸出每行中間省略號(hào)問(wèn)題
這篇文章主要介紹Python pandas模塊輸出每行中間省略號(hào)問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07

