C語言中自我遞迴的幾個例子
阿新 • • 發佈:2019-01-30
遞迴
遞迴就是一個函式在它的函式體內呼叫它自身。執行遞迴函式將反覆呼叫其自身,每呼叫一次就進入新的一層。
遞迴函式必須有結束條件。
遞迴分為回推和遞推兩個階段,當一直回推,直到遇到牆後返回,這個牆就是結束條件。
所以遞迴要有兩個要素,回推牆與遞推關係
例題 計算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; //回推牆
程式在計算5的階乘的時候,先執行遞推,當n=1或者n=0的時候返回1,再回推將計算並返回。由此可以看出遞迴函式必須有結束條件
遞迴函式特點:
1. 每一級函式呼叫時都有自己的變數,但是函式程式碼並不會得到複製,如計算5的階乘時每遞推一次變數都不同; 2. 每次呼叫都會有一次返回,如計算5的階乘時每遞推一次都返回進行下一次; 3. 遞迴函式中,位於遞迴呼叫前的語句和各級被呼叫函式具有相同的執行順序; 4. 遞迴函式中,位於遞迴呼叫後的語句的執行順序和各個被呼叫函式的順序相反; 5. 遞迴函式中必須有終止語句。 一句話總結遞迴:自我呼叫且有完成狀態。例題 小明為了學好英語,需要每天記單詞,第一天記1個,第二天記2個依次類推,請用程式碼完成,算出小明第10天開始的時候會了多少個單詞?
#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; }