欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2018年10月22日 09:06:06   作者:北鼻coder  
這篇文章主要介紹了python 遞歸深度優(yōu)先搜索與廣度優(yōu)先搜索算法模擬實(shí)現(xiàn) ,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

 一、遞歸原理小案例分析

(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)文章

最新評(píng)論