深入理解遞迴

2021-09-30 11:27:02 字數 1820 閱讀 9795

/*遞迴例子*/

#includevoid up_and_down(int);

int main(void)

void up_and_down(int n)

level 1:#1 location 0022ff10

level 2:#1 location 0022fef0

level 3:#1 location 0022fed0

level 4:#1 location 0022feb0

level 4:#2 location 0022feb0

level 3:#2 location 0022fed0

level 2:#2 location 0022fef0

level 1:#2 location 0022ff10

process returned 0 (0x0) execution time : 0.149 s

press any key to continue.

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

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

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

#includevoid to_binary(unsigned long n);

int main(void)

printf("done./n");

return 0; }

void to_binary(unsigned long n) /*遞迴函式*/

輸出: 2->10

深入理解遞迴

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

深入理解遞迴

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

深入理解遞迴演算法

下面是對遞迴演算法執行過程的理解 結合漢諾塔問題 原始碼 public class hanoi else public static void main string args 為了方便我等下解釋執行過程,也把 的截圖貼在下面 準備工作做完了,正式開始理解過程的講解 以漢諾塔三個圓盤時為例,這裡n ...