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

python 利用棧和隊列模擬遞歸的過程

 更新時間:2018年05月29日 10:08:20   作者:漁單渠  
這篇文章主要介紹了python 利用棧和隊列模擬遞歸的過程,文中并通過兩段代碼給大家介紹了下遞歸和非遞歸的區(qū)別,需要的朋友可以參考下

一、遞歸

遞歸調(diào)用:一個函數(shù),調(diào)用的自身,稱為遞歸調(diào)用
遞歸函數(shù):一個可以調(diào)用自身的函數(shù)稱為遞歸函數(shù)

  凡是循環(huán)能干的事,遞歸都能干

方法:

1、寫出臨界條件
2、找這一次和上一次的關(guān)系
3、假設(shè)當前函數(shù)已經(jīng)能用,調(diào)用自身計算上一次的結(jié)果再求出本次的結(jié)果

  下面我們通過兩段代碼簡單看一下遞歸和非遞歸的區(qū)別:

    輸入一個大于等于1的數(shù),求1到n的和!

# 普通函數(shù)方法
def hanshu(n):
 sum = 0
 # 循環(huán)遍歷每一個數(shù)字,將他們加到一個事先定義好的變量上,直到加完
 for x in range(1, n+1):
  sum += x
 return sum

  下面看一下通過遞歸的方法:

# 遞歸
def digui(n):
 if n == 1:
  return 1 # 如果n等于1證明已經(jīng)遞歸到最后,返回1,這就是上述的臨界條件
 else:
  return n + digui(n-1) # 當沒有達到臨界條件時,用n加上對n-1的遞歸,每次都把n加進去,但是后面依然是使用當下這個遞歸函數(shù),會再次調(diào)用計算n-1,直到遞歸結(jié)束,也就是將從n到1的數(shù)全部遞歸完

  在實際應(yīng)用中,遞歸是十分消耗內(nèi)存的,但是有些事情他很容易去做,很容易理解。下面,就通過一個案例介紹一下遞歸的用法。

二、遞歸遍歷目錄

  下面的內(nèi)容我就通過解釋代碼來講解了,如果哪里講的不清楚,歡迎大家下方評論提意見。

import os # 由于我們遍歷目錄,所以要找到那個目錄并操作,os模塊包含普遍的操作系統(tǒng)功能
path = "" # 這是我們要遍歷的目錄的路徑,需要自己寫進去
# 既然是遞歸函數(shù),那么肯定要有個函數(shù),而且這個函數(shù)還將在函數(shù)內(nèi)部再次被調(diào)用
def getAllDir(path, sp = ''): # 參數(shù)中傳入路徑和sp,這個我最后說一句你就明白了
 # 得到當前目錄下的所有文件
 filesList = os.listdir(path) # os.listdir()是os模塊下的一個方法,相當于Linux中的ls,查看所有文件
 sp += " " # 這個也先放一下
 # 處理每一個文件
 for fileName in filesList: # 遍歷剛才找到的目錄下的所有文件
  # 判斷是否是目錄(要用絕對路徑)
  fileAbsPath = os.path.join(path,fileName) # join是os模塊下將兩個路徑拼接在一起的意思,第二個參數(shù)不能有斜杠。因為我們要判斷一下這個文件是一個普通文件還是一個目錄,所有要先把他的絕對路徑整理出來
  if os.path.isdir(fileAbsPath): # isdir是判斷是否為目錄,是則返回True
   print(sp + "目錄:", fileName) # 打印當前這個文件,他是個目錄
   getAllDir(fileAbsPath,sp = " ") # 這里就開始遞歸了,因為我們要找到整個目錄里的東西,所以當這個文件還是個目錄的時候我們需要繼續(xù)向下找
  else:
   print(sp + "普通文件:", fileName) # 如果僅僅是個普通文件,那么他里面也就沒有其他文件了,就可以直接打印他了
getAllDir(path) # 這里是調(diào)用函數(shù),讓遍歷開始
# 最后我來說一下開始寫的那個sp,是space的意思,有人也許現(xiàn)在就明白了。那個其實就是讓我們方便觀察,因為每次打印都是頂行寫的,我們分不清他的目錄結(jié)構(gòu),所以通過空格來調(diào)整。在函數(shù)內(nèi)部寫一個空格增加的表達式,可以使調(diào)用次數(shù)和空格數(shù)相關(guān)起來,遞歸的越深,證明目錄的級越低,那么空格越多

三、棧模擬遞歸遍歷目錄(深度遍歷)

# 整體思路是沒有變得,這里沒有寫到的也許是重復(fù)的,看下上面注釋就好了
# 寫了一半想起來應(yīng)該回來寫一下棧:棧就是一個容器,但它只有一個口,入棧出棧都從這一個口,而且這個棧很細,進去了就不能顛倒位置了,所以,每入棧一個元素他在最外面時候可以出來,否則得等前面的走完了它才可以出來
import os
def getAllDirDFS(path):
 stack = [] # 這里是用棧來模擬,我們先創(chuàng)建一個列表當做棧
 stack.append(path) # 首先,先向棧里壓入路徑
 # 處理棧,當棧為空時結(jié)束循環(huán)(棧為空就說明棧里沒有普通文件和目錄了,因為我們是每操作一個要把那個取出來)
 while len(stack) != 0:
  # 從棧中取出數(shù)據(jù)
  dirPath = stack.pop() # pop函數(shù)是刪除最后一個元素,同時還有一個返回值,就是去除的那個元素,我們再接收一下等等用
  # 目錄下所有文件
  filesList = os.listdir(dirPath) # 這個和上面一樣
  # 處理每一個文件,如果是普通文件則打印出來,如果是目錄則將該目錄地址壓棧
  for fileName in filesList:
   # print(dirPath)
   fileAbsPath = os.path.join(dirPath,fileName)
   # print(fileAbsPath)
   if os.path.isdir(fileAbsPath):
    # 是目錄就壓棧
    print("目錄:" + fileName)
    stack.append(fileAbsPath) # 當是目錄時入棧,它這時就在最外面,下一次循環(huán)時候要取出棧的元素是不是還是這個啊,既然是它的話就還有找他內(nèi)部的東西,等把他找完了才繼續(xù)找和他并列的那些文件。就是說抓住一根繩子使勁往下找,找到頭沒有了才返回來,這就是深度優(yōu)先遍歷
   else:
    # 打印普通文件
    print("普通:" + fileName)
getAllDirDFS(path)

 四、隊列模擬遞歸遍歷目錄(廣度遍歷)

# 這回記住了,先說一下隊列,隊是一個兩端開口的模型,一頭進一頭出,當然還有雙向隊列,循環(huán)等等,我們就簡單用一下最基本的隊列
import collections # 隊列在python的包里有,所以我們直接調(diào)用一下,不用以為這個很難,他也只不過是類型是queue,實際的思想是一樣的,入隊append,因為這個是在右側(cè),也就是后方入隊,另一邊出的話就是popleft,左側(cè)出,是不是很通俗,只是改了一下出來的口
def getAllDirBFS(path):
 queue = collections.deque() # 創(chuàng)建一個隊列,只要記得后面用法就是上面我說的那個不同就可以了
 queue.append(path)
 while len(queue) != 0:
  dirPath = queue.popleft() # 僅僅這里不同,因為隊列模擬是另一端出隊
  filesList = os.listdir(dirPath)
  for fileName in filesList:
   fileAbsPath = os.path.join(dirPath,fileName)
   if os.path.isdir(fileAbsPath):
    print('目錄:' + fileName)
    queue.append(fileAbsPath)
   else:
    print('文件:' + fileName)
getAllDirBFS(path)  
# 大家想一下,棧是哪里進哪里出,也就是,剛進去的元素,接下來的一次循環(huán)又出來了,那便是一條路走到頭,是深度遍歷;那么現(xiàn)在一頭進另一頭出是什么意思呢,就是即便判斷了這個是一個目錄,但我現(xiàn)在不執(zhí)行你,我要把你前面這些都查一遍,找完是目錄的都添加在后面,之后再遍歷你們這些,就是把一層的內(nèi)容找完再找下一層,被稱為廣度優(yōu)先遍歷。

總結(jié)

以上所述是小編給大家介紹的python 利用棧和隊列模擬遞歸的過程,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 如何使用 Python 中的功能和庫創(chuàng)建 n-gram

    如何使用 Python 中的功能和庫創(chuàng)建 n-gram

    在計算語言學(xué)中,n-gram 對于語言處理、上下文和語義分析非常重要,它們是從令牌字符串中相鄰的連續(xù)單詞序列,本文將討論如何使用 Python 中的功能和庫創(chuàng)建 n-gram,感興趣的朋友一起看看吧
    2023-09-09
  • Python Opencv任意形狀目標檢測并繪制框圖

    Python Opencv任意形狀目標檢測并繪制框圖

    這篇文章主要為大家詳細介紹了Python Opencv任意形狀目標檢測,并繪制框圖,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Django中使用 Closure Table 儲存無限分級數(shù)據(jù)

    Django中使用 Closure Table 儲存無限分級數(shù)據(jù)

    對于數(shù)據(jù)量大的情況(比如用戶之間有邀請鏈,有點三級分銷的意思),就要用到 closure table 的結(jié)構(gòu)來進行存儲。這篇文章主要介紹了Django中使用 Closure Table 儲存無限分級數(shù)據(jù),需要的朋友可以參考下
    2019-06-06
  • Python實現(xiàn)自動運行代碼的方法詳解

    Python實現(xiàn)自動運行代碼的方法詳解

    在軟件開發(fā)和數(shù)據(jù)科學(xué)領(lǐng)域,自動運行代碼是提高效率和確保一致性的關(guān)鍵,本文將深入探討如何使用Python實現(xiàn)自動運行代碼的各種方法,希望對大家有所幫助
    2023-12-12
  • Python利用Nagios增加微信報警通知的功能

    Python利用Nagios增加微信報警通知的功能

    Nagios是一款開源的免費網(wǎng)絡(luò)監(jiān)視工具,能有效監(jiān)控Windows、Linux和Unix的主機狀態(tài),交換機路由器等網(wǎng)絡(luò)設(shè)置,打印機等,本文給大家介紹Python利用Nagios增加微信報警通知的功能,需要的朋友參考下
    2016-02-02
  • Python 刪除連續(xù)出現(xiàn)的指定字符的實例

    Python 刪除連續(xù)出現(xiàn)的指定字符的實例

    今天小編就為大家分享一篇Python 刪除連續(xù)出現(xiàn)的指定字符的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • python數(shù)據(jù)分析Numpy庫的常用操作

    python數(shù)據(jù)分析Numpy庫的常用操作

    numpy 是 Python 的一個科學(xué)計算的庫,提供了矩陣運算的功能,其一般與 Scipy、matplotlib 一起使用,這篇文章總結(jié)下python數(shù)據(jù)分析Numpy庫的常用操作,感興趣的朋友一起看看吧
    2022-01-01
  • Python?webargs?模塊的簡單使用

    Python?webargs?模塊的簡單使用

    webargs是一個用于解析和驗證HTTP請求對象的Python庫,今天通過本文給大家介紹Python?webargs?模塊的安裝使用,感興趣的朋友一起看看吧
    2022-01-01
  • openCV中值濾波和均值濾波的代碼實現(xiàn)

    openCV中值濾波和均值濾波的代碼實現(xiàn)

    在我們生活中的有很多時候都可以用到濾波,例如美顏的磨皮功能,本文就詳細的介紹了openCV中值濾波和均值濾波的代碼實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Python?matplotlib繪制散點圖配置(萬能模板案例)

    Python?matplotlib繪制散點圖配置(萬能模板案例)

    這篇文章主要介紹了Python?matplotlib繪制散點圖配置(萬能模板案例),散點圖是指在??回歸分析???中,數(shù)據(jù)點在直角坐標系平面上的?分布圖???,散點圖表示因變量隨??自變量???而?變化???的大致趨勢,據(jù)此可以選擇合適的函數(shù)??對數(shù)???據(jù)點進行?擬合
    2022-07-07

最新評論