關於遞迴的理解

2021-07-25 13:33:24 字數 1446 閱讀 3672

遞迴的執行順序

最近看了一些遞迴的例子,發現呼叫遞迴之前的語句和遞迴之後的語句執行順序是正好相反的,這是給我的最大感受,具體看如下例子

/*遞迴例子*/

#include

void up_and_down(int);

int main(void)

void up_and_down(int n)

輸出結果

level 1:n location 0240ff48

level 2:n location 0240ff28

level 3:n location 0240ff08

level 4:n location 0240fee8

level 4:n location 0240fee8

level 3:n location 0240ff08

level 2:n location 0240ff28

level 1:n location 0240ff48

首先, main() 使用引數 1 呼叫了函式 up_and_down() ,於是 up_and_down() 中形式引數 n 的值是 1, 故列印語句 #1 輸出了 level1 。

然後,由於 n 的數值小於 4 ,所以 up_and_down() (第 1 級)使用引數 n+1 即數值 2 呼叫了 up_and_down()( 第 2 級 ). 使得 n 在第 2

級呼叫中被賦值 2, 列印語句 #1 輸出的是 level2 。與之類似,下面的兩次呼叫分別列印出 level3 和 level4 。

當開始執行第 4 級呼叫時, n 的值是 4 ,因此 if 語句的條件不滿足。這時候不再繼續呼叫 up_and_down() 函式。第 4 級呼叫接

著執行列印語句 #2 ,即輸出 level4 ,因為 n 的值是 4 。現在函式需要執行 return 語句,此時第 4 級呼叫結束,把控制權返回給該

函式的呼叫函式,也就是第 3 級呼叫函式。第 3 級呼叫函式中前乙個執行過的語句是在 if 語句中進行第 4 級呼叫。因此,它繼

續執行其後繼**,即執行列印語句 #2 ,這將會輸出 level3 .當第 3 級呼叫結束後,第 2 級呼叫函式開始繼續執行,即輸出

level2 .依次類推.

注意,每一級的遞迴都使用它自己的私有的變數 n .可以檢視位址的值來證明.

遞迴的基本原理:

1 每一次函式呼叫都會有一次返回.當程式流執行到某一級遞迴的結尾處時,它會轉移到前一級遞迴繼續執行.

2 遞迴函式中,位於遞迴呼叫前的語句和各級被調函式具有相同的順序.如列印語句 #1 位於遞迴呼叫語句前,它按照遞

歸呼叫的順序被執行了 4 次.

3 每一級的函式呼叫都有自己的私有變數.

4 遞迴函式中,位於遞迴呼叫語句後的語句的執行順序和各個被呼叫函式的順序相反.

5 雖然每一級遞迴有自己的變數,但是函式**並不會得到複製.

6 遞迴函式中必須包含可以終止遞迴呼叫的語句.

關於遞迴的理解

關於遞迴,相信很多人最初接觸的就是斐波那契數列的計算。那麼這裡就先不講解斐波那契數列,先舉乙個簡單的例子來想一想生活中的遞迴。假設情人節馬上到了,你收到女朋友送來的禮物,禮物是乙個非常漂亮的盒子。你懷著激動的心情去拆盒子,但是第乙個盒子開啟裡面也裝著乙個盒子,然後你又開啟第二個盒子,發現裡面又是乙個...

關於遞迴的初步理解

遞迴,按照執行順序來看就好像是一層又一層的空間,呼叫自身的地方是入口,條件是出口,當不滿足條件時,從出口出去,回到上一層。所以在遞迴的過程中要搞清楚當前是在哪一層,並且確認當前的引數是什麼。按照 3 層hanoi 塔來說。第一層第乙個遞迴呼叫 3,src,aux,dst 2,src,dst,aux1...

關於對hanoi塔遞迴的理解

對遞迴的理解的要點主要在於放棄 放棄你對於理解和跟蹤遞迴全程的企圖,只理解遞迴兩層之間的交接,以及遞迴終結的條件。想象你來到某個熱帶叢林,意外發現了十層之高的漢諾塔。正當你苦苦思索如何搬動它時,林中出來乙個土著,毛遂自薦要幫你搬塔。他名叫二傻,戴著乙個草帽,草帽上有乙個2字,號稱會把一到二號盤搬到任...