遞迴呼叫的深層抽象

2021-06-07 23:59:37 字數 2060 閱讀 8323

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

[cpp]

view plain

copy

print

?

/*遞迴例子*/

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

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

[cpp]

view plain

copy

print

?

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

#include

void to_binary(unsigned long n);  

int main(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): 

函式的遞迴呼叫

乙個函式在它的函式體內呼叫它自身稱為遞迴呼叫。這種函式稱為遞迴函式。c語言允許函式的遞迴呼叫。在遞迴呼叫中,主調函式又是被調函式。執行遞迴函式將反覆呼叫其自身。每呼叫一次就進入新的一層。例如有函式f如下 int f int x 這個函式是乙個遞迴函式。但是執行該函式將無休止地呼叫其自身,這當然是不正...

遞迴的呼叫順序

鋪地板 地板長度為4寬為1,磚頭為1x1 1x2。一共有多少種方法填滿地板,遞迴解題。static int n 4 static int result 0 static void getresult int len if len n return if len 1 n if len 2 n getr...

遞迴呼叫的理解

關於遞迴呼叫的理解問題 前幾天做題的時候,發現 資料結構高分筆記 第一章有這樣乙個思考題,對理解遞迴呼叫幫助很大,題目如下 題目 逆序輸出單鏈表的資料域,要求 指標l指向鍊錶首元結點,且只用l乙個指標 一 分析 在單鏈表的情況下,要逆序輸出結點資料只用乙個指標,除了用遞迴呼叫,好象沒有別的方法了。關...