問題描述
有5個人坐在一起,問第5個人多少歲,他說比第4個人大2歲。問第4個人多少歲,他說比第3個人大2歲。問第3人多少歲,他說比第2個人大2歲。問第2個人多少歲,他說比第1個人大2歲。最後問第1個人,他說他是10歲。編寫程式,當輸入第幾個人時求出其對應的年齡。
問題分析
該問題是乙個遞迴問題。要求第5個人的年齡,必須先知道第4個人的年齡,顯然第4個人的年齡也是未知的,但可以由第3個人的年齡推算出來。而想知道第3個人的年齡又必須先知道第2個人的年齡,第2個人的年齡則取決於第1個人的年齡。
又已知每個人的年齡都比其前乙個人的年齡大2,因此根據題意,可得到如下幾個表示式:
age(5)=age(4)+2
age(4)=age(3)+2
age(3)=age(2)+2
age(2)=age(1)+2
age(1)=10
歸納上面5個表示式,用數學公式表達出來為:
求解第n個人的年齡分成兩個階段。第乙個階段是「回推」過程,第二個階段是「遞推」過程。
在「回推」過程中,利用的是n>1時的公式age(n-l)+2。要求的是第n個人的年齡,因此首先將第n個人的年齡回推到第n-1個人的年齡,但第n-1個人的年齡仍然未知,因此需要繼續回推到第n-2個人的年齡,第n-2個人的年齡仍然未知,需要繼續向前回推,如此下去,一直回推到第1個人的年齡。而第1個人的年齡是已知的,因此,第一階段的 「回推」結束。
在「遞推」過程中,從第1個人的年齡可以推出第2個人的年齡,從第2個人的年齡可以推出第3個人的年齡,如此下去一直遞推到第5個人的年齡。
演算法設計
理解了問題分析中的遞迴處理過程後,演算法設計就非常簡單了。只需要將公式轉換成乙個函式,然後用main()函式呼叫它就可以了。
下面是完整的**:
#includeint fun(int n)
int main()
執行結果:
請輸入n值:5
第5個人的年齡為18
知識點補充
由該題的分析過程可知,遞迴的問題都可以分為「回推」和「遞推」兩個階段。而且必須存在乙個能夠結束遞迴過程的條件,如本題中的age(l)=10,否則遞迴過程會無限制地進行下去而無法結束。
注意
在編寫遞迴函式時需要注意,函式中定義的區域性變數和形式引數只在當前的呼叫層有效,當回推到簡單問題時,原來呼叫層中的區域性變數和引數都被隱藏起來。每乙個簡單問題層中都有自己的區域性變數和引數。
遞迴解決年齡問題 c語言實現
問題描述 有5個人坐在一起,問第5個人多少歲,他說比第4個人大2歲。問第4個人多少歲,他說比第3那個人大2歲。問第3個人多少歲,他說比第2個人大2歲。問第2個人多少歲,他說比第1個人大2歲。最後問第乙個人,他說他是10歲。編寫程式,當輸入第幾個人時求出其對應的年齡。問題分析 該問題是乙個遞迴問題。要...
遞迴算年齡
問題描述1 第1個人10歲,第2個人比第乙個人大3歲,第3個人比第2個人大3歲 第8個人比第7個人大3歲,那麼第8個人是多少歲?public class getage 測試 public static void main string args 問題描述2 第8個人的年齡是36歲,第7個人比第8個人...
遞迴 遞迴法解決排列問題
方法1 程式大致結構 約定 pl len pl 為最終放置結果的陣列 len為陣列的長度 ele為參與排列的個元素出現的個數 i為pl中下標 假設參與排列的元素有abcd run ele,int i 注意 在遞迴塊內,不應對所傳入的引數進行改變 每個遞迴塊所得到的原始引數應保持一致。舉例 abcde...