遞歸(recursion)就是子程序(或函數)直接調用自己或通過一系列調用語句間接調用自己,是一種描述問題和解決問題的基本方法。
豐城網站制作公司哪家好,找成都創新互聯!從網頁設計、網站建設、微信開發、APP開發、響應式網站設計等網站項目制作,到程序開發,運營維護。成都創新互聯于2013年創立到現在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網站建設就選成都創新互聯。
遞歸通常用來解決結構自相似的問題。所謂結構自相似,是指構成原問題的子問題與原問題在結構上相似,可以用類似的方法解決。具體地,整個問題的解決,可以分為兩部分:第一部分是一些特殊情況,有直接的解法;第二部分與原問題相似,但比原問題的規模小。實際上,遞歸是把一個不能或不好解決的大問題轉化為一個或幾個小問題,再把這些小問題進一步分解成更小的問題,直至每個小問題都可以直接解決。因此,遞歸有兩個基本要素:
(1)邊界條件:確定遞歸到何時終止,也稱為遞歸出口。
(2)遞歸模式:大問題是如何分解為小問題的,也稱為遞歸體。遞歸函數只有具備了這兩個要素,才能在有限次計算后得出結果
漢諾塔問題:對漢諾塔問題的求解,可以通過以下3個步驟實現:
(1)將塔上的n-1個碟子借助塔C先移到塔B上;
(2)把塔A上剩下的一個碟子移到塔C上;
(3)將n-1個碟子從塔B借助塔A移到塔C上。
在遞歸函數中,調用函數和被調用函數是同一個函數,需要注意的是遞歸函數的調用層次,如果把調用遞歸函數的主函數稱為第0層,進入函數后,首次遞歸調用自身稱為第1層調用;從第i層遞歸調用自身稱為第i+1層。反之,退出第i+1層調用應該返回第i層。采用圖示方法描述遞歸函數的運行軌跡,從中可較直觀地了解到各調用層次及其執行情況,具體方法如下:
(1)寫出函數當前調用層執行的各語句,并用有向弧表示語句的執行次序;
(2)對函數的每個遞歸調用,寫出對應的函數調用,從調用處畫一條有向弧指向被調用函數入口,表示調用路線,從被調用函數末尾處畫一條有向弧指向調用語句的下面,表示返回路線;
(3)在返回路線上標出本層調用所得的函數值。n=3時漢諾塔算法的運行軌跡如下圖所示,有向弧上的數字表示遞歸調用和返回的執行順序
三、遞歸函數的內部執行過程
一個遞歸函數的調用過程類似于多個函數的嵌套的調用,只不過調用函數和被調用函數是同一個函數。為了保證遞歸函數的正確執行,系統需設立一個工作棧。具體地說,遞歸調用的內部執行過程如下:
(1)運動開始時,首先為遞歸調用建立一個工作棧,其結構包括值參、局部變量和返回地址;
(2)每次執行遞歸調用之前,把遞歸函數的值參和局部變量的當前值以及調用后的返回地址壓棧;
(3)每次遞歸調用結束后,將棧頂元素出棧,使相應的值參和局部變量恢復為調用前的值,然后轉向返回地址指定的位置繼續執行。
上述漢諾塔算法執行過程中,工作棧的變化如下圖所示,其中棧元素的結構為(返回地址,n值,A值,B值,C值),返回地址對應算法中語句的行號,分圖的序號對應圖中遞歸調用和返回的序號
我可以幫助你,你先設置我最佳答案后,我百度Hii教你。
所謂遞歸,說的簡單點,就是函數自己調用自己,然后在某個特定條件下。結束這種自我調用。
如果不給予這個結束條件,就成了無限死循環了。這樣這個遞歸也就毫無意義了。
如下面問題
1 1 2 3 5 8 13 21 ........n
分析可以看出, i 表示第幾個數, n 表示該數的值
當i = 1 時, n = 1;
當i = 2 時, n = 1;
當i = 3 時 n = i1 + i2;
當i = 4 時 n = i2 + i3
所以可以寫個函數
int fun(int n) // 這里的n代表第幾個數
{
if(1 == n || 2 == n) // 第一個數
{
return 1;
}
else
{
return fun(n - 1) + fun(n - 2); // 這里就是自己調用自己,形成循環自我調用。
}
}
注: 以上代碼只是用來演示遞歸,不包含錯誤校驗。
在實際生產過程中。該代碼不夠健壯。
如此,就完成了遞歸。你就可以求得第n個數了。
何時考慮使用遞歸。
當你分析一個問題的時候,發現這個問題,是一個自我循環時,而且這個自我循環到一個給定值,就可以終止的時候,你就快要考慮遞歸了。
int findf( int n ){
int a,b,c;
b = n % 2;
c = 0;
if ( n4){
if (b==c){
a=findf( n-1 ) + findf( n-3 );
}
else{
a=findf( n-2 ) + findf( n-4 );
}
return a;
}
else if ( n 0){
return -1;
}
else{
return 1;
}
}
標題名稱:c語言定義函數遞歸 c語言遞歸函數詳解
文章地址:http://m.newbst.com/article40/dogodeo.html
成都網站建設公司_創新互聯,為您提供品牌網站建設、、品牌網站制作、網站內鏈、網站改版、做網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯