1. 程式人生 > >棧與遞歸

棧與遞歸

通過 TP 地址 返回 所有 gif div 每次 觀察

今天說的是棧與遞歸的關系,函數的遞歸調用和普通函數調用是一樣的。當程序執行到某個函數時,將這個函數進行入棧操作,在入棧之前,通常需要完成三件事。

  1、將所有的實參、返回地址等信息傳遞給被調函數保存。(輸入參數和標記返回值地址)

  2、為被調函數的局部變量分配存儲區。(分配局部變量地址空間)

  3、將控制轉移到北調函數入口。(給予控制權)

當一個函數完成之後會進行出棧操作,出棧之前同樣要完成三件事。

  1、保存被調函數的計算結果。(返回值)

  2、釋放被調函數的數據區。(釋放局部變量地址空間)

  3、依照被調函數保存的返回地址將控制轉移到調用函數。(交還控制權)

上述操作必須通過棧來實現,即將整個程序的運行空間安排在一個棧中。

每當運行一個函數時,就在棧頂分配空間,函數退出後,釋放這塊空間。

所以當前運行的函數一定在棧頂。因此,在整個棧中遞歸循環調用的函數中,越晚調用越早返回

接下來我們來觀察一個簡單的遞歸。

技術分享圖片
#include <stdio.h>

void recurrence(int num)
{
    if ( num < 0 )
        return;
    printf("%d\n", num);
    recurrence(num - 1); 
   printf("%d\n", num);
} int main(void) { recurrence(5); return 0; }
技術分享圖片

技術分享圖片

程序每次運行到recurrence()函數時都會進入這個這個函數,直到num為0時返回,返回之後會接著運行recurrence()後面的代碼,箭頭代表函數控制權轉移,請看圖示。

技術分享圖片

棧與遞歸