幾個小例子來理解遞迴
一、 先來一點基礎的認識:
1、遞迴是乙個不斷的將乙個問題分成更小的子問題最終找到乙個簡單的基礎問題,最後再由基礎問題的解決逐步向上解決初始問題的過程。所以不難看出,遞迴其實是分為兩部分的乙個是向下的遞推過程,另乙個就是向上的回溯過程。
2、從上面我們已不難發現,在這個過程中,是存在著棧的先進後出的過程的。而二者的關係就是在呼叫函式的時候,python會分配乙個棧幀來處理該函式的區域性變數。當函式返回時,返回值就在棧的頂端,以供呼叫者訪問。
這裡需要注意的是:棧幀限定了函式所用變數的作用域。儘管反覆呼叫相同的函式,但是每一次呼叫都會為函式的區域性變數建立新的作用域。
形式上就是函式的自我呼叫。
3、那麼如何去分析乙個問題是否能夠用遞迴的方法來解決,這就涉及到了遞迴三原則。
1)遞迴必須有基本情況。能夠結束遞迴
2)遞迴演算法必須能改變其狀態向基本情況靠近
3)遞迴演算法必須遞迴呼叫自己
二、上一點生動的栗子
這是乙個最簡單的遞迴過程了。但是卻是屬於麻雀雖小五臟俱全。
首先if語句,基本條件判定。
第4行,自我呼叫,這是後就建立了棧幀逐個儲存stack[3,6,9,12,15,18]【右邊是棧底】
第5行,print函式,直觀地展現回溯過程。
def digui(n):
if n < 1:
return false
digui(n-3)
return print(n)
digui(18)
再來乙個有點難度的,四柱漢諾塔,更多遞迴的栗子可以看那兩篇第五周和第六周的變成作業。這裡為了方便理解循序漸進一下。不搞太難。
1、在這個栗子中增加了查詢表。主要是為了應對遞迴過程中無用計算太多的情況。
2、但是這個還是相對簡單,因為類似於第乙個栗子,它主要體現了乙個遞推的過程並沒有利用回溯結果來做什麼事。
def hanoi_t_4(n):
tower_list = [0] * (n + 1) #建立查詢表
def f(m):
if tower_list[m]: # 如果在遞迴過程中,有儲存的結果,直接返回。
return tower_list[m] # 這裡得到rerun值以後,本次遞迴就算結束了。而不會繼續進行下面result的賦值
result = 2 ** m - 1
for x in range(1, m):
result = min(result, 2 * f(x) + 2 ** (m - x) - 1)
tower_list[m] = result
return result
return f(n)
print(hanoi_t_4(int(input())))
利用turtle來視覺化理解遞推+回溯的綜合利用。
繪製分形樹
from turtle import *
def tree(branchlen,t):
if branchlen > 5: #1、基本情況,當最小枝丫小於5時,分解為最小問題
# 2、基本情況運算,先順著一根枝幹,達到最末端短枝
t.forward(branchlen)
t.right(20)
tree(branchlen-15,t)
# 3、利用遞迴返回,進行左側枝條繪製
t.left(40)
tree(branchlen-10,t)
t.right(20)
t.backward(branchlen)
t = turtle()
mywin = t.getscreen()
t.left(90)
t.up()
t.backward(300)
t.down()
t.color('green')
tree(110,t)
mywin.exitonclick()
認認真真再走一遍過程。這樣就更加清楚的明白到底遞迴究竟是個怎麼一回事了。
良心整理了,看完這個絕對對遞迴基本的思路就比較清晰了。老鐵們覺得有用,可以收藏一下或者關注一下哦。希望有和我一樣開始學習python的小夥伴可以結伴而行。
怎麼理解遞迴
遞迴最經典的例子就是 從前有座山,山里有座廟,廟裡有個老和尚,正在給小和尚講故事呢!故事是什麼呢?從前有座山,山里有座廟,廟裡有個老和尚,正在給小和尚講故事呢!故事是什麼呢?從前有座山,山里有座廟,廟裡有個老和尚,正在給小和尚講故事呢!故事是什麼呢?遞迴需要幾個條件 1,遞迴必須 要有邊界條件,也就...
mysql理解 理解MySQL(一)MySQL介紹
1 第一層 連線 執行緒處理 2 第二層 mysql的核心服務功能,包括查詢解析 分析 優化和快取,所有跨儲存引擎的功能都在這一層實現 3 第三層 儲存引擎。儲存引擎負責mysql中資料的儲存和提取。二 併發控制 1 讀寫鎖 在處理併發讀或者寫時,可以通過實現乙個由兩種型別的鎖組成的鎖系統來解決這個...
python中的遞迴怎麼寫 python遞迴怎麼寫
程式呼叫自身的程式設計技巧稱為遞迴 recursion 遞迴做為一種演算法在程式語言中廣泛應用。乙個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法,它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大...