无码一区二区三区高清在线观-无码一区二区三区高清在线-无码一区二区三区电影-无码一区二区三区不卡av-无码一区二区三区不卡-无码一区二区三区va在线播放

萬能百科  > 職業資格  > 

C語言遞歸函數的執行與求解

2022-11-30   

C語言遞歸函數的執行與求解

導語:函數的遞歸調用是在調用一個函數的執行過程中,直接或間接地調用該函數本身,使用遞歸函數的程序結構清晰,簡單、易懂。下面就由小編為大家介紹一下C語言遞歸函數的執行與求解,歡迎大家閱讀!


(資料圖片僅供參考)

1 遞歸函數

C語言的特點之一就在于允許函數的遞歸調用,即允許在函數內部直接或間接的調用函數自身,被調用的函數被稱為遞歸函數。遞歸調用有直接遞歸調用和間接遞歸調用兩種形式,遞歸函數常用于解決那些需要分多次求解且每次求解過程都基本類似的問題。構造遞歸函數的關鍵在于尋找遞歸算法和終結條件。遞歸算法就是解決問題所采取的方法和步驟,一般只要對問題的若干次求解過程進行分析和歸納,找出每一次求解過程之間的規律性,就可歸納出遞歸算法,終結條件是為了終結函數的遞歸調用而設置的一個條件或規則。遞歸調用的一般形式為:

函數類型 函數名(參數列表)

{

,,,,,

函數名(參數列表)

…..

}

2 遞歸條件

使用遞歸調用編寫程序時,要注意以下幾點:

(1)可以通過遞歸調用來縮小問題規模,且新問題與原問題有著相同的形式,只是所處理的對象具有一定的規律性。也就是說解決問題的方法相同,調用函數的參數有規律的遞增或遞減。

(2)遞歸函數必須有一個終止處理條件,即必須有一個明確的結束條件,必須在適當的時候能夠結束遞歸調用,否則會使程序陷入死循環,導致系統崩潰。

(3)有些使用遞歸算法求解的問題也可使用普通循環算法來實現,相較于循環程序,遞歸程序結構簡單,邏輯清晰,但運行效率低,故在有其他算法可以代替的情況下,要盡量避免使用遞歸算法編寫程序。

3 遞歸實例

例:使用遞歸方法求n!。

在數學上n!=1×2×3×…×n-1×n,我們可以寫成以下形式

1 當n=0或n=1時

n!=

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

根據以上形式,可以寫出如下遞歸調用程序:

int f(n)

{

if(n==1||n==0)

return 1;

else

return f(n-1)*n;

}

int main()

{

int n;

scanf(“%d”,&n);

if(n<0)

printf(“data error!”);

else

printf(“%d”,f(n));

return 0;

}

4 遞歸函數執行過程

遞歸調用之所以能夠實現,是因為函數在每一次執行過程中,都會把自己所有形參變量和局部變量復制一個副本,壓入棧中,這些副本分別位于棧中不同的內存空間,和函數的其他執行過程毫不相干,這種機制使得遞歸調用成為可能。一個遞歸函數的執行過程類似于調用函數和被調用函數是同一個函數的多層嵌套調用,因此,和遞歸函數的執行過程密切相關的一個重要概念就是遞歸函數運行的層次。假設調用該遞歸函數的主函數為第0層,則從主函數調用遞歸函數則進入第一層;從第n層調用本函數則進入“下一層”,即第n+1層。反之,退出第n層遞歸調用應返回至“上一層”,即第n-1層。

在遞歸函數的執行過程中,另一個非常重要的概念是“遞歸工作?!钡氖褂茫斠粋€函數(調用者)調用另外一個函數(被調用者)時,系統會把調用者的所有實在參數,被調用者的形式參數、局部變量,以及調用者的返回地址等信息全部壓入“遞歸工作棧”暫存,當被調用者執行完畢時,系統會從棧中彈出被調用者的形式參數和局部變量,釋放被調用者所占用的數據區,接著被調用者返回,然后系統從棧中彈出調用者的返回地址,和實在參數等信息,此時調用者函數可以繼續執行下去。

5 求解方法

我們通過舉例來說具體說明遞歸函數的求解,比如在主函數中輸入n的值為5,即求5!,則函數的求解過程可以用圖1-1表示:

以上問題的具體求解過程描述如下:①調用函數f(5),n=5,函數f(5)的返回結果是f(4)*5,系統暫存f(5)的形參和中間計算結果,然后轉去調用函數f(4)。②執行函數f(4),n=4,函數f(4)的.返回結果是f(3)*4,系統暫存f(4)的形參和中間計算結果,然后轉去調用函數f(3)。③執行函數f(3),n=3,函數f(3)的返回結果是f(2)*3,系統暫存f(3)的形參和中間計算結果,然后轉去調用函數f(2)。④執行函數f(2),n=2,函數f(2)的返回結果是f(1)*2,系統暫存f(2)的形參和中間計算結果,然后轉去調用函數f(1)。⑤執行函數f(1),n=1,函數f(1)返回結果1,f(1)執行完畢,系統釋放f(1)的形參和中間變量所占的數據區,然后返回到調用函數f(1)處。⑥函數f(2)返回結果f(1)*2=1*2=2,f(2)執行完畢,系統釋放f(2)的形參和中間變量所占的數據區,然后返回到調用函數f(2)處。⑦函數f(3)返回結果f(2)*3=2*3=6,f(3)執行完畢,系統釋放f(3)的形參和中間變量所占的數據區,然后返回到調用函數f(3)處。⑧函數f(4)的返回結果f(3)*4=6*4=24,f(4)執行完畢,系統釋放f(4)的形參和中間變量所占的數據區,然后返回到調用函數f(4)處。⑨函數f(5)返回結果f(4)*5=24*5=120,f(5)執行完畢,系統釋放f(5)的形參和中間變量所占的數據區,然后返回到調用函數f(5)處,即main函數,此問題求解結束。

6 結束語

函數的遞歸調用,可以把一個大型復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞歸算法只需用少量的程序就可描述出解題過程所需要的多次重復計算,大大減少了程序的代碼量并增強了程序的可讀性。但在求解過程中容易出錯和混淆,了解遞歸函數的執行過程,并借助于圖示化的方法、,即可正確、快速求解遞歸函數。

詞條內容僅供參考,如果您需要解決具體問題
(尤其在法律、醫學等領域),建議您咨詢相關領域專業人士。

推薦詞條

主站蜘蛛池模板: 日韩视频高清 | 国产午夜欧美福利在线观看 | 久久精品伊人久久精品 | 日韩精品在线视频观看 | av岛国小电影在线观看 | 在线一区二区中文字幕 | 国产成人短视频在线观看免费 | 免费人妻不卡中文字幕 | 91香蕉视频在线播放 | 成人av一区在线观看 | 日韩国产一级一区精品 | 人妻激情偷乱视频一区二区三区 | 欧美精品色婷婷五月综合 | 成人性生交大片免费看中文 | 无码av岛国片在线观看免费 | 2024国产最新盗摄在线播放 | 99re 久久这里只有精品6 | 国产日韩美女被无套内射免费观看 | 日本无翼乌邪恶大全彩男男 | 永久免费视频 | 亚洲AVAV天堂AV在线网爱情 | 91麻豆亚洲国产成人久久精品 | 亚洲爆乳无码专区 | 亚洲伦理片一区二区三区 | 第四房色播网 | 欧美成人精品欧美一级乱黄一区二区精品在线 | 制服丝袜中文丝袜av | 久久久久性色av毛片特级 | 51福利国产在线观看午夜天堂 | 日韩免费黄色片 | 国产一区二区三区四区五在线观看 | 精品人妻无码一区二区三区9 | 亚洲日产精品一二三四区 | 国产乱伦视频 | 日本高清免费视频毛片 | v天堂v手机在线 | 国产视频一区在线观看 | 爱豆直击国产精品原创av片国产 | 国产爽视频在线观看视频 | 99久久er热在这里都是精品66 | 精品国产一区二区三区久久久狼 |