資料結構之 棧和遞迴 函式呼叫

2021-07-22 15:43:00 字數 1714 閱讀 4387

更正:以下所指ebx應改為eax。

ebx指「基位址」暫存器,在記憶體定址時存放基位址;、

eax是累加器(accumulator),一般用來儲存函式的返回值。

首先說說遞迴的實現和棧的關係吧,這裡引入乙個著名的尾遞迴-斐波那契數列的實現,我用的是c語言編寫該函式,

int fib(int n)

我們不妨把函式fib和return語句中呼叫的函式看作是不同的函式(只是具有了相同的名稱),那麼就涉及到了函式呼叫的知識,我們知道,在函式呼叫的過程中(比如a函式中呼叫了b函式),編譯器就會把a函式的引數,區域性變數及返回位址壓入棧中儲存,再進行b函式的呼叫。這裡用彙編的思想解釋會比較生動,如下圖所示,假設傳入引數為5

此時返回值已有確定值,開始按順序出棧,執行到有返回位址字樣時執行命令call ***x(跳入該函式體內執行該函式),如下圖

執行到這裡跳入fib(3)函式體內,我們不妨進入函式體內看看,

int fib(int n)         

操作同第一步,

下一步,出棧,由於fib(3)的值已經明確,繼續出棧

由於fib(3)的值已經明確,繼續出棧

步入fib(4)函式體內,同理執行到return 2+fib(2)語句,呼叫函式fib(2),

出棧,

值已明確,繼續出棧

步入函式fib(5),執行至return 3+fib(3)語句處,呼叫函式fib(3)

同理步入fib(3)函式,執行至return 1+fib(1)語句處,呼叫函式fib(1),進而出棧,ebx更新為2,繼續出棧

fib(5)已有確定值,出棧,此時棧空,即fib(5)等於5.

到這裡我們就可以比較直**出遞迴及函式呼叫過程中與棧的關係了,棧的這種先進後出的特性在計算機中被廣泛運用。

當然我的所述皆出於自己的理解,如果有錯誤歡迎指正!

補充:在《0day安全:軟體漏洞分析技術》上看到的一張圖畫得很詳細,也一併貼出來。

Python資料結構與演算法 棧和遞迴函式

棧的常用操作 stack 建立乙個空的棧物件 push 把乙個元素新增到棧的最頂層 pop 刪除棧最頂層的元素,並返回這個元素 peek 返回最頂層的元素,並不刪除它 isempty 判斷棧是否為空 size 返回棧中元素的個數 使用python中的列表進行對棧的實現 class stack 對棧進...

資料結構 遞迴呼叫學習

在回顧資料結構的時候,重新學習了一下對遞迴的使用,希望對您有幫助。package com.qxlx 迴圈改遞迴 改為遞迴的關鍵是發現邏輯 相似性 不要忘記遞迴出口 構造相似性 如果沒有明顯的相似性,需要主動構造 不能相似的原意很可能是缺少引數 遞迴與數學上的的遞推公式和類似 author jia p...

資料結構和演算法之遞迴

遞迴問題 方法自己呼叫自己,每次呼叫傳入不同的值 public class recursiontest public static void test int n system.out.println n n public class recursiontest02 public static in...