函式的祕密之 遞迴函式
阿新 • • 發佈:2020-12-13
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 { 8printf("輸入錯誤!\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)); 25return 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的階乘時每遞推一次都返回進行下一次;
遞迴函式中,位於遞迴呼叫前的語句和各級被呼叫函式具有相同的執行順序;
遞迴函式中,位於遞迴呼叫後的語句的執行順序和各個被呼叫函式的順序相反;
遞迴函式中必須有終止語句。
一句話總結遞迴:自我呼叫且有完成狀態