python學習筆記16(遞迴 棧和佇列)

2021-09-07 04:22:33 字數 3785 閱讀 4333

遞迴呼叫:乙個函式,呼叫了自身,稱為遞迴呼叫

遞迴函式:乙個會呼叫自身的函式稱為遞迴函式

特點:凡是迴圈能幹的事,遞迴都能幹

過程:

1、寫出臨界條件

2、找這一次和上一次的關係

3、假設當前函式已經能用,呼叫自身計算上一次的結果,再求出本次的結果

#輸入乙個數(大於等於1),求1+2+3+……+n的和

#用for迴圈

def sum1(n):

sum = 0

for x in range(1, n + 1):

sum += x

return sum

res = sum1(res)

print("res =", res)

#用遞迴

def sum2(n):

if n == 1:

return 1

else:

return n + sum2(n - 1)#sum2中執行sum2

res = sum2(5)

print("res =", res)

#輸出:res = 15

定義:一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向乙個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從乙個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素

特點:先入後出

#模擬棧結構

stack =

#壓棧(向棧裡存資料)

print(stack)

print(stack)

print(stack)

#出棧(在棧裡取資料)

res1 = stack.pop()

print("res1 =", res1)

print(stack)

res2 = stack.pop()

print("res2 =", res2)

print(stack)

res3 = stack.pop()

print("res3 =", res3)

print(stack)

佇列

定義:一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾進行刪除操作的端稱為隊頭

特點:先入先出

import collections

#建立乙個佇列

queue = collections.deque()

print(queue)

#進隊(存資料)

print(queue)

print(queue)

print(queue)

#出隊(取資料)

res1 = queue.popleft()

print("res1 =", res1)

print(queue)

res2 = queue.popleft()

print("res2 =", res2)

print(queue)

res3 = queue.popleft()

print("res3 =", res3)

print(queue)

遞迴遍歷目錄

#給定乙個目錄,列印所有該目下的子目錄以及檔案,包括子目錄下面的子目錄

import os

def getalldir(path, sp = ""):

#得到當前目錄下所有的檔案

fileslist = os.listdir(path)

#處理每乙個檔案

sp += " " #產生縮排

for filename in fileslist:

#恢復成絕對路徑名

fileabspath = os.path.join(path, filename)

if os.path.isdir(fileabspath): #判斷是否是路徑(用絕對路徑)

print(sp + "目錄:", filename)

#遞迴呼叫

getalldir(fileabspath, sp) #挖掘該目錄下的子目錄

else:

print(sp + "普通檔案:", filename)

getalldirre(r"c:\users\xgg\desktop\temp\dir")

利用棧遍歷目錄

import os

def getalldirde(path):

stack =

#處理棧,當棧為空的時候結束迴圈

while len(stack) != 0:

#從棧裡取出並刪除資料

dirpath = stack.pop()

#得到目錄下所有檔案

fileslist = os.listdir(dirpath)

#處理每乙個檔案,如果是普通檔案則列印出來,如果是目錄則將該目錄的位址壓棧並列印(由淺入深)

for filename in fileslist:

fileabspath = os.path.join(dirpath, filename)

if os.path.isdir(fileabspath): #判斷是否是目錄

#是目錄就列印並壓棧

print("目錄:" + filename)

else:

#列印普通檔案

print("普通:" + filename)

getalldirde(r"c:\users\xgg\desktop\temp\dir")

利用佇列遍歷目錄

import os

import collections

def getalldirqu(path):

queue = collections.deque()

#進隊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)

else:

print("普通檔案:" + filename)

getalldirqu(r"c:\users\xgg\desktop\temp\dir")

c 學習筆記 16 遞迴

遞迴 能夠解決那些難以用簡單迴圈解決的問題 例如 八皇后問題,階乘 遞迴函式 呼叫自身的函式 1.階乘 0 1 1!1 n n n 1 n 1 n 1 n 2 假設函式factorial n 為求n 如果呼叫到n 0的情況,函式直接返回結果,函式知道如何求解最簡單的情形,稱之為基本情況或者 停止條件...

Python學習筆記 16

自己總結的 遞迴就是將大的問題分解為相同的小問題,方法內重複呼叫自己 求10的階乘 10 deffactorial n for迴圈方法 result n for i in range 1 n result i return result n 4 print factorial n 遞迴就是將大的問題...

python學習筆記(16)

因為列舉成員不是有序的,所以它們只支援通過標識 identity 和相等性 equality 進行比較。enum 類的列舉是不支援大小運算子的比較的。使用 intenum 類進行列舉,就支援比較功能。usr bin env python3 coding utf 8 import enum class...