遞迴呼叫:乙個函式,呼叫了自身,稱為遞迴呼叫
遞迴函式:乙個會呼叫自身的函式稱為遞迴函式
特點:凡是迴圈能幹的事,遞迴都能幹
過程:
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...