20201023_081.遞迴函式_函式呼叫記憶體分析_棧幀的建立
遞迴函式
遞迴函式指的是:自己呼叫自己的函式,在函式體內部直接或間接地自己呼叫自己。遞迴類似於大家中學數學學習過的“數學歸納法”。 每個遞迴函式必須包含兩個部分:
- 終止條件
表示遞迴什麼時候結束。一般用於返回值,不再呼叫自己。 - 遞迴邏輯關係
把第 n 步的值和第 n-1 步相關聯。
注意:遞迴函式會在棧中建立大量的函式物件,過量的消耗記憶體和運算能力,在處理大量資料時慎用。
【案例】
def test(n):
print('test{}begin'.format(n))
if n == 1:
print(1)
else:
test(n - 1)
print('test{}finished'.format(n))
test(3)
執行結果:
棧記憶體過程分析:
最開始執行test(3),在test(3)函式裡一行一行執行,過程中列印了結果的第1行:“test3begin”,判斷完n不=1,–>else: ,馬上要執行下一條程式碼,棧裡是這樣的
所以執行test(2),這時test(3)還沒執行完。在tes(2)函式裡一行一行執行,過程中列印了結果的第2行:“test2begin”,判斷完n不=1,–>else: ,馬上要執行下一條程式碼,棧裡是這樣的
同理,執行test(1),這時test(3)、test(2)還沒執行完。棧裡是這樣
然後就在test(1)函式裡一行一行執行,
–>列印結果的第3行:“test1begin”,
–>判斷n=1,列印結果的第4行:“1”,else的不執行了
–>列印結果的第5行:“test1finished”
然後test(1)就執行完了,test(1)佔用的棧空間釋放掉,棧裡變成了這樣
然後繼續執行test(2)中剩下的程式碼,列印結果的第6行:“test2finished”,列印完後,test(2)執行完,test(2)佔用的棧空間釋放,棧裡變成了這樣
同理,接下來繼續執行test(3)中剩下的程式碼,列印結果的最後一行,第7行:“test1finished”,列印完,test(3)也會執行完,釋放棧空間。接下來還會釋放掉定義test函式的棧空間(上面的圖沒畫),整個程式執行完成。
相關文章
- 函式棧幀(呼叫過程)函式
- JavaScript 中匿名函式的遞迴呼叫JavaScript函式遞迴
- 函式呼叫棧函式
- 函式呼叫暫存器及棧幀結構函式
- 函式的遞迴函式遞迴
- 遞迴函式遞迴函式
- 函式表示式–遞迴函式遞迴
- 第 8 節:函式-匿名函式、遞迴函式函式遞迴
- 遞迴函式的理解遞迴函式
- JavaScript 函式遞迴JavaScript函式遞迴
- php遞迴函式PHP遞迴函式
- 函式之遞迴函式遞迴
- JS函式表示式——函式遞迴、閉包JS函式遞迴
- 函式遞迴與生成式函式遞迴
- Python 函式進階-遞迴函式Python函式遞迴
- 僅用遞迴函式和棧操作逆序一個棧遞迴函式
- 函式呼叫棧的問題函式
- 共享記憶體函式記憶體函式
- 如何僅用遞迴函式和棧操作逆序一個棧遞迴函式
- 好程式設計師Python教程系列遞迴函式與匿名函式呼叫程式設計師Python遞迴函式
- C語言函式呼叫棧C語言函式
- 初學 PHP 函式的遞迴PHP函式遞迴
- 常用記憶體操作函式記憶體函式
- 1.5.6 python遞迴函式Python遞迴函式
- 13.0、python遞迴函式Python遞迴函式
- day 17 – 1 遞迴函式遞迴函式
- 遞迴函式例項大全遞迴函式
- 遞迴函式-樹形列表遞迴函式
- Golang記憶體分配內建函式之new函式Golang記憶體函式
- [20180531]函式呼叫與遞迴.txt函式遞迴
- 【C語言】函式的概念和函式的呼叫(引數傳遞)C語言函式
- 好程式設計師Python培訓分享Python的遞迴函式與匿名函式呼叫程式設計師Python遞迴函式
- 手撕記憶體操作函式記憶體函式
- 測開之函式進階· 第1篇《遞迴函式》函式遞迴
- 從記憶體分配策略(堆、棧)的角度分析,函式傳遞指標真的比傳值效率高嗎?記憶體函式指標
- C#語言函式遞迴C#函式遞迴
- GO語言————6.6 遞迴函式Go遞迴函式
- 直觀理解(尾)遞迴函式遞迴函式