1. 程式人生 > >C語言中自我遞迴的幾個例子

C語言中自我遞迴的幾個例子

遞迴

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

遞迴函式必須有結束條件

遞迴分為回推和遞推兩個階段,當一直回推,直到遇到牆後返回,這個牆就是結束條件。

所以遞迴要有兩個要素,回推牆與遞推關係

例題 計算n的階乘 #include <stdio.h> 
int factorial(int n) {     int result;     if (n<0)                                          //判斷例外     {         printf("輸入錯誤!\n");         return 0;     } else if (n==0 || n==1)                 {                     result = 1;  //回推牆
                }             else                 {                     result = factorial(n-1) * n;  //遞推關係,這個數與上一個數之間的關係。                 }     return result; } int main(){     int n = 5;                                              //輸入數字5,計算5的階乘     printf("%d的階乘=%d",n,factorial(n));     return 0; }

程式在計算5的階乘的時候,先執行遞推,當n=1或者n=0的時候返回1,再回推將計算並返回。由此可以看出遞迴函式必須有結束條件

遞迴函式特點:

    1. 每一級函式呼叫時都有自己的變數,但是函式程式碼並不會得到複製,如計算5的階乘時每遞推一次變數都不同;     2. 每次呼叫都會有一次返回,如計算5的階乘時每遞推一次都返回進行下一次;     3. 遞迴函式中,位於遞迴呼叫前的語句和各級被呼叫函式具有相同的執行順序;     4. 遞迴函式中,位於遞迴呼叫後的語句的執行順序和各個被呼叫函式的順序相反;     5. 遞迴函式中必須有終止語句。 一句話總結遞迴:自我呼叫且有完成狀態。
例題 小明為了學好英語,需要每天記單詞,第一天記1個,第二天記2個依次類推,請用程式碼完成,算出小明第10天開始的時候會了多少個單詞?
分析: 回推牆是“第一天記1個” 遞推關係是“第n天記的單詞= 第n-1天記的單詞數量+n"

#include <stdio.h>

/* 定義獲取單詞數量的函式 */ int getWordNumber(n) {        if(n == 1)     {         return 1;    //回推牆     }     else{         return getWordNumber(n-1)+n ;       //遞推關係     } } int main() {     int num = getWordNumber(10);     //獲取會了的單詞數量     printf("小明第10天記了:%d個單詞。\n", num);     return 0; }
例題 有5個人坐在一起,問第5個人多少歲?他說比第4個人大2歲。問第4個人歲數,他說比第3個人大2歲。問第3個人,又說比第2人大兩歲。問第2個人,說比第1個人大兩歲。最後 問第1個人,他說是10歲。請問第5個人多大?

程式分析:

利用遞迴的方法,遞迴分為回推和遞推兩個階段。要想知道第5個人歲數,需知道第4人的歲數,依次類推,推到第1人(10歲),再往回推。

#include <stdio.h> /*  * 請使用遞迴函式完成本題  * 小編已將正確程式碼放在左側任務的“不知道怎麼辦”裡  * 小編希望各位童鞋獨立完成哦~  */ //定義一個函式,傳送人員序號進去,返回該序號員工的年齡。 int getAge(numPeople) {     //定義返回的年齡     int age;     //如果是第1個人的時候,年齡為10歲     if(numPeople==1)         age=10;  //這是回推牆,也就是結束遞迴的條件。     else         //還沒接觸到回推牆,就自我呼叫,謂之遞迴。         age = getAge(numPeople-1)+2;  //年齡等於上一個人的年齡加2     return age; } int main() {  printf("第5個人的年齡是%d歲", getAge(5));  return 0; 例題 猴子第一天摘下N個桃子,當時就吃了一半,還不過癮,就又多吃了一個。第二天又將剩下的桃子吃掉一半,又多吃了一個。以後每天都吃前一天剩下的一半零一個。到第10天在想吃的時候就剩一個桃子了,問第一天共摘下來多少個桃子?並反向列印每天所剩桃子數。
#include <stdio.h> //定義一個函式,輸入第n天,返回該天剩下的桃子數 int getPeachNumber(n) {     int num;    //定義所剩桃子數     if(n==10)     {        num=1;       //遞迴結束條件,即回推牆        return num;     }     else     {         num = (getPeachNumber(n+1) + 1) * 2;   //遞推關係         printf("第%d天所剩桃子%d個\n", n, num); //天數,所剩桃子個數     }     return num; } int main() {     int num = getPeachNumber(1);     printf("猴子第一天摘了:%d個桃子。\n", num);     return 0; }