函式的遞迴呼叫

2021-04-13 13:58:50 字數 2409 閱讀 6906

乙個函式在它的函式體內呼叫它自身稱為遞迴呼叫。 這種函式稱為遞迴函式。c語言允許函式的遞迴呼叫。在遞迴呼叫中, 主調函式又是被調函式。執行遞迴函式將反覆呼叫其自身。 每呼叫一次就進入新的一層。例如有函式f如下:

int f (int x)

這個函式是乙個遞迴函式。 但是執行該函式將無休止地呼叫其自身,這當然是不正確的。為了防止遞迴呼叫無終止地進行, 必須在函式內有終止遞迴呼叫的手段。常用的辦法是加條件判斷, 滿足某種條件後就不再作遞迴呼叫,然後逐層返回。 下面舉例說明遞迴呼叫的執行過程。

[例5.9]用遞迴法計算n!用遞迴法計算n!可用下述公式表示:

n!=1 (n=0,1)

n×(n-1)! (n>1)

按公式可程式設計如下:

long ff(int n)

main()

long ff(int n)

main()

程式中給出的函式ff是乙個遞迴函式。主函式呼叫ff 後即進入函式ff執行,如果n<0,n==0或n=1時都將結束函式的執行,否則就遞迴呼叫ff函式自身。由於每次遞迴呼叫的實參為n-1,即把n-1 的值賦予形參n,最後當n-1的值為1時再作遞迴呼叫,形參n的值也為1,將使遞迴終止。然後可逐層退回。下面我們再舉例說明該過程。 設執行本程式時輸入為5, 即求 5!。在主函式中的呼叫語句即為y=ff(5),進入ff函式後,由於n=5,不等於0或1,故應執行f=ff(n-1)*n,即f=ff(5-1)*5。該語句對ff作遞迴呼叫即ff(4)。 逐次遞迴展開如圖5.3所示。進行四次遞迴呼叫後,ff函式形參取得的值變為1,故不再繼續遞迴呼叫而開始逐層返回主調函式。ff(1)的函式返回值為1,ff(2)的返回值為1*2=2,ff(3)的返回值為2*3=6,ff(4) 的返回值為6*4=24,最後返回值ff(5)為24*5=120。

例5. 9也可以不用遞迴的方法來完成。如可以用遞推法,即從1開始乘以2,再乘以3…直到n。遞推法比遞迴法更容易理解和實現。但是有些問題則只能用遞迴演算法才能實現。典型的問題是hanoi塔問題。

[例5.10]hanoi塔問題

一塊板上有三根針,a,b,c。a針上套有64個大小不等的圓盤, 大的在下,小的在上。如圖5.4所示。要把這64個圓盤從a針移動c針上,每次只能移動乙個圓盤,移動可以借助b針進行。但在任何時候,任何針上的圓盤都必須保持**在下,小盤在上。求移動的步驟。

本題演算法分析如下,設a上有n個盤子。

如果n=1,則將圓盤從a直接移動到c。

如果n=2,則:

1.將a上的n-1(等於1)個圓盤移到b上;

2.再將a上的乙個圓盤移到c上;

3.最後將b上的n-1(等於1)個圓盤移到c上。

如果n=3,則:

a. 將a上的n-1(等於2,令其為n`)個圓盤移到b(借助於c),

步驟如下:

(1)將a上的n`-1(等於1)個圓盤移到c上,見圖5.5(b)。

(2)將a上的乙個圓盤移到b,見圖5.5(c)

(3)將c上的n`-1(等於1)個圓盤移到b,見圖5.5(d)

b. 將a上的乙個圓盤移到c,見圖5.5(e)

c. 將b上的n-1(等於2,令其為n`)個圓盤移到c(借助a),

步驟如下:

(1)將b上的n`-1(等於1)個圓盤移到a,見圖5.5(f)

(2)將b上的乙個盤子移到c,見圖5.5(g)

(3)將a上的n`-1(等於1)個圓盤移到c,見圖5.5(h)。

到此,完成了三個圓盤的移動過程。

從上面分析可以看出,當n大於等於2時, 移動的過程可分解為三個步驟:

第一步 把a上的n-1個圓盤移到b上;

第二步 把a上的乙個圓盤移到c上;

第三步 把b上的n-1個圓盤移到c上;其中第一步和第三步是類同的。

當n=3時,第一步和第三步又分解為類同的三步,即把n`-1個圓盤從乙個針移到另乙個針上,這裡的n`=n-1。 顯然這是乙個遞迴過

程,據此演算法可程式設計如下:

move(int n,int x,int y,int z)

}main()

move(int n,int x,int y,int z)

}main()

從程式中可以看出,move函式是乙個遞迴函式,它有四個形參n,x,y,z。n表示圓盤數,x,y,z分別表示三根針。move 函式的功能是把x上的n個圓盤移動到z 上。當n==1時,直接把x上的圓盤移至z上,輸出x→z。如n!=1則分為三步:遞迴呼叫move函式,把n-1個圓盤從x移到y;輸出x→z;遞迴呼叫move函式,把n-1個圓盤從y移到z。在遞迴呼叫過程中n=n-1,故n的值逐次遞減,最後n=1時,終止遞迴,逐層返回。當n=4 時程式執行的結果為

input number:

4the step to moving 4 diskes:

a→ba→c

b→ca→b

c→ac→b

a→ba→c

b→cb→a

c→ab→c

a→ba→c

b→c

函式的遞迴呼叫

遞迴函式 呼叫自己本身的函式叫遞迴函式 實現如下 main.c define crt secure no warnings include include 遞迴列印字串逆序 int reverse char str if str 0 判斷遞迴結束條件 reverse str 1 printf c s...

函式的遞迴呼叫

函式的遞迴呼叫 是函式巢狀呼叫的一種特殊形式 具體是指 在呼叫乙個函式的過程中又直接或者間接地呼叫到本身 直接呼叫本身 deff1 print 是我是我還是我 f1 f1 間接接呼叫本身 deff1 print f1 f2 deff2 print f2 f1 f1 一段 的迴圈執行的方案有兩種 方式...

函式的遞迴呼叫

程式呼叫自身的程式設計技巧成為遞迴,它可以將乙個大型複雜的問題層層分解成與原問題相似的小問題通過少量的 達到大事化小。遞迴的兩個必要條件 1.存在限制條件,當滿足這個限制條件的時候,遞迴便不再繼續。2.每次遞迴呼叫之後越來越接近這個限制條件。不建立臨時變數求字串長度 include include ...