深入理解遞迴函式的呼叫過程

2022-09-18 11:06:22 字數 2111 閱讀 3667

下面是個關於遞迴呼叫簡單但是很能說明問題的例子:

[cpp]view

plain

copy

/*遞迴例子*/

#include

void

up_and_down(

int);  

intmain(

void

)    

void

up_and_down(

intn)  

輸出結果

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 遞迴函式中必須包含可以終止遞迴呼叫的語句.

再看乙個具體的遞迴函式呼叫的例子:以二進位制形式輸出整數

[cpp]view

plain

copy

/*輸入乙個整數,輸出二進位制形式*/

#include

void

to_binary(unsigned 

long

n);  

intmain(

void

)    

printf("done./n"

);  

return

0;  

}  void

to_binary(unsigned 

long

n)    

/*遞迴函式*/

輸出結果

enter an integer(q to quit):

9binary equivalent :1001

enter an integer(q to quit):

255binary equivalent :11111111

enter an integer(q to quit): 

深入理解遞迴函式的呼叫過程

下面是個關於遞迴呼叫簡單但是很能說明問題的例子 遞迴例子 includevoid up and down int int main void void up and down int n 輸出結果 level 1 n location 0240ff48 level 2 n location 0240...

函式遞迴的呼叫過程

函式遞迴的呼叫過程 當函式n 5時,fact n 1 時要呼叫n 4,所以依次呼叫,上圖所示就是函式的呼叫,當n 0時返回到n 1一直到n 5的函式呼叫 例項解析 字串反轉 將字串s反轉後輸出,s 1 將列表中,從頭到尾以 1的步長輸出,而 1的步長就是指從後往前輸出 函式 分支結構 遞迴鏈條 遞迴...

深入理解遞迴

以此類推是遞迴的基本思想。具體來講就是把規模大的問題轉化為規模小的相似的子問題來解決。在函式實現時,因為解決大問題的方法和解決小問題的方法往往是同乙個方法,所以就產生了函式呼叫它自身的情況。另外這個解決問題的函式必須有明顯的結束條件,這樣就不會產生無限遞迴的情況了。遞迴的兩個條件 遞迴演算法的一般形...