1. 程式人生 > 實用技巧 >函式的祕密之 遞迴函式

函式的祕密之 遞迴函式

C 語言自學之 遞迴函式

 1 #include <stdio.h>
 2  
 3 /* 定義獲取單詞數量的函式 */
 4 int getWordNumber(int n)
 5 {
 6     if(n == 1)
 7     {
 8         return 1;    //第一天只會1個單詞
 9     }
10     else{
11         return getWordNumber(n-1)+n ;       //到第天會的單詞數量,每天都為單詞數量都比前一天多1,表示式為 (n-1)+n
12     }
13 }
14 int main()
15 {
16 int num = getWordNumber(10); //獲取會了的單詞數量 17 printf("小明第10天記了:%d個單詞。\n", num); 18 return 0; 19 }

遞迴就是一個函式在它的函式體內呼叫它自身。執行遞迴函式將反覆呼叫其自身,每呼叫一次就進入新的一層。

Dome 1 :計算n的階乘可以使用以下程式碼:

 1 #include <stdio.h>
 2  
 3 int factorial(int n)//定義函式
 4 {
 5     int result;
 6     if(n<0)
 7     {
 8
printf("輸入錯誤!\n"); 9 return 0; 10 } 11 else if(n==0 || n==1) 12 { 13 result=1; 14 } 15 else 16 { 17 result = factorial(n-1)*n;//呼叫自身 18 } 19 return result; 20 } 21 int main() 22 { 23 int n=5; 24 printf("%d的階乘=%d",n,factorial(n)); 25
return 0; 26 }

執行結果為:5的階乘=120

Dome 2:

 1 #include <stdio.h>
 2  
 3 int getPeachNumber(n)
 4 {
 5     int num;    //定義所剩桃子數
 6     if(n==10)
 7     {
 8        return 1;      //遞迴結束條件
 9     }
10     else
11     {
12         num = (getPeachNumber(n+1)+1)*2;   //這裡是不應該用遞迴呢?
13         printf("第%d天所剩桃子%d個\n", n, num); //天數,所剩桃子個數
14     }
15     return num;
16 }
17 int main()
18 {
19     int num = getPeachNumber(1);
20     printf("猴子第一天摘了:%d個桃子。\n", num);
21     return 0;
22 }
 1 #include <stdio.h>
 2  
 3 int getPeachNumber(n)
 4 {
 5     int num;    //定義所剩桃子數
 6     if(n==10)
 7     {
 8        return 1;      //遞迴結束條件
 9     }
10     else
11     {
12         num = (getPeachNumber(n+1)+1)*2;   //這裡是不應該用遞迴呢?
13         printf("第%d天所剩桃子%d個\n", n, num); //天數,所剩桃子個數
14     }
15     return num;
16 }
17 int main()
18 {
19     int num = getPeachNumber(1);
20     printf("猴子第一天摘了:%d個桃子。\n", num);
21     return 0;
22 }

遞迴函式特點:
每一級函式呼叫時都有自己的變數,但是函式程式碼並不會得到複製,如計算5的階乘時每遞推一次變數都不同;
每次呼叫都會有一次返回,如計算5的階乘時每遞推一次都返回進行下一次;
遞迴函式中,位於遞迴呼叫前的語句和各級被呼叫函式具有相同的執行順序;
遞迴函式中,位於遞迴呼叫後的語句的執行順序和各個被呼叫函式的順序相反;
遞迴函式中必須有終止語句。
一句話總結遞迴:自我呼叫且有完成狀態