遞迴解決年齡問題 c語言實現

2021-09-29 12:03:01 字數 1998 閱讀 1221

問題描述:

有5個人坐在一起,問第5個人多少歲,他說比第4個人大2歲。問第4個人多少歲,他說比第3那個人大2歲。問第3個人多少歲,他說比第2個人大2歲。問第2個人多少歲,他說比第1個人大2歲。最後問第乙個人,他說他是10歲。編寫程式,當輸入第幾個人時求出其對應的年齡。

問題分析:

該問題是乙個遞迴問題。要求第五個人的年齡,必須先知道第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個表示式,用數學公式表達出來為:

age(n)=age(n-1)+2

求解第n個人的年齡分成兩個階段。第乙個階段是「回推」過程,第二個階段是「遞推」過程。

在「回推」過程中,利用的是n>1時的公式age(n-1)+2。要求的是第n個人的年齡,因此首先將第n個人的年齡回推到第n-1個人的年齡,但第n-1個人的年齡仍然未知,因此需要繼續回推到第n-2個人的年齡,第n-2個人的年齡仍然未知,需要繼續向前回推,如此下去,已知回推到第1個人的年齡。而第1個人的年齡是已知的,因此,第一階段的「回推」結束。

在「遞推」過程中,從第1個人的年齡可以退出第二個人的年齡,從第2個人的年齡可以推出第3個人的年齡,如此下去一直遞推到第5個人的年齡。

演算法設計:

理解了問題分析中的遞迴處理過程後,演算法設計就非常簡單了。只需要將公式轉換成乙個函式,然後用main() 函式呼叫它就可以了。

下面是完整的**:

#include

int age(int n)

int x;

if(n == 1)

x = 10;

else

x = age(n - 1) + 2;

return x;

int main()

int n;

printf("請輸入n值:");

scanf("%d",&n);

printf("第%d個人的年齡為%d\n",n,age(n));

return 0;

執行結果:

請輸入n值:5

第5個人的年齡為18

知識點補充:

由該題的分析過程可知,遞迴的問題都可以分為「回推」和「遞迴」兩個階段。而且必須存在乙個能夠結束遞迴過程的條件,如本題中的age(1)=10,否則遞迴過程會無限制地進行下去而無法結束。

下面對遞迴法做下總結。

遞迴是設計和描述演算法的一種強有力的工具。能夠採用遞迴來描述的演算法通常具有如下的特徵:為求解規模為n的問題,首先要將它分解成規模較小的問題,然後通過這些小問題的解,能夠方便的構造出大問題的解。

同時,這些規模較小的問題也能夠採取同樣的分解方法分解成規模更小的問題,並能夠通過這些更小的問題的解構造出規模較大的問題的解。特別地,當問題規模n=0或n=1時,能直接獲得問題地解。

遞迴演算法地執行過程分為「回推」和「遞迴」兩個階段:

在回推階段,是把較複雜地問題(規模為n)的求解遞迴到比原問題簡單一些的問題(規模小於n)的求解。例如本例中,要求解age(n),先把它遞推到求解age(n-1),而要計算age(n-1),又必須先計算age(n-2),依次類推,直到計算age(1)為止。需要注意的是,在遞推階段,必須要有能夠終止遞迴的條件。如本例中n為1時,遞推可終止。

在遞推階段,當獲得最簡單情況的解時,如本題中得到age(1)的值,逐級返回,依次得到較複雜問題的解,最終獲得所求問題的解。

在編寫遞迴函式時需要注意,函式中定義的區域性變數和形式引數只在當前的呼叫層有效,當回推到簡單問題時,原來呼叫層中的區域性變數和引數都被隱藏起來。每乙個簡單問題層中都有自己的區域性變數和引數。

2 遞迴解決年齡問題

問題描述 有5個人坐在一起,問第5個人多少歲,他說比第4個人大2歲。問第4個人多少歲,他說比第3個人大2歲。問第3人多少歲,他說比第2個人大2歲。問第2個人多少歲,他說比第1個人大2歲。最後問第1個人,他說他是10歲。編寫程式,當輸入第幾個人時求出其對應的年齡。問題分析 該問題是乙個遞迴問題。要求第...

C語言實現遞迴演算法

c語言實現遞迴演算法 遞迴演算法是運用於函式呼叫中的。遞迴的概念 在乙個函式體內呼叫自身稱為函式的遞迴呼叫。遞迴呼叫的原理 需要在函式內滿足一定的條件後不在呼叫自身或者結束,或者呼叫其它函式,否則容易出現類似死迴圈的情況,程式將癱瘓。已知 f 1 1 f 0 0,fn n f n 1 f n 2 求...

C語言實現Fibonacci數列遞迴

問題描述 fibonacci數列的遞推公式為 fn fn 1 fn 2,其中f1 f2 1。當n比較大時,fn也非常大,現在我們想知道,fn除以10007的餘數是多少。include include int n 10007 計算fibonacci函式 int fibo程式設計客棧nacci int ...