新聞中心
c語言函數(shù)的遞歸應用
我解釋下具體執(zhí)行過程:
成都創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務領域包括:網(wǎng)站設計制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的黃州網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!
printf("%d!=%ld\n",num,mul(num));
這里調(diào)用了mul(num)方法,第一個值是5,進入方法后,
if(51) x=5*mul(5-1);
這里又調(diào)用了一次方法,
mul(5-1)
這里就是遞歸調(diào)用了,需要把4的值帶入方法又執(zhí)行一次,
變成:if(41) x=4*mul(4-1);
這里又調(diào)用了一次方法,
mul(4-1)
依次類推為:if(31) x=3*mul(3-1);
if(21) x=2*mul(2-1);
這里看懂了沒,遞歸函數(shù)關鍵字在“遞”和“歸”,相當于循環(huán),一直到條件不滿足時在“歸”,一步步return直到第一個調(diào)用的mul方法。在return主函數(shù)。
也就是從最后一次調(diào)用
mul(2-1)時
n的值為1了,執(zhí)行else語句,結束“遞”方法操作,return語句,返回X=1,那么接下來變?yōu)?/p>
if(21) x=2*1,返回X=2,接下來變?yōu)椋?/p>
if(31) x=3*2,返回X=6,接下來變?yōu)椋?/p>
if(41) x=4*6,返回X=24,接下來變?yōu)椋?/p>
if(51) x=5*24,返回X=120 結束遞歸調(diào)用。
希望你能看懂,還有問題在補充吧!
c語言遞歸函數(shù)
遞歸(recursion)就是子程序(或函數(shù))直接調(diào)用自己或通過一系列調(diào)用語句間接調(diào)用自己,是一種描述問題和解決問題的基本方法。
遞歸通常用來解決結構自相似的問題。所謂結構自相似,是指構成原問題的子問題與原問題在結構上相似,可以用類似的方法解決。具體地,整個問題的解決,可以分為兩部分:第一部分是一些特殊情況,有直接的解法;第二部分與原問題相似,但比原問題的規(guī)模小。實際上,遞歸是把一個不能或不好解決的大問題轉(zhuǎn)化為一個或幾個小問題,再把這些小問題進一步分解成更小的問題,直至每個小問題都可以直接解決。因此,遞歸有兩個基本要素:
(1)邊界條件:確定遞歸到何時終止,也稱為遞歸出口。
(2)遞歸模式:大問題是如何分解為小問題的,也稱為遞歸體。遞歸函數(shù)只有具備了這兩個要素,才能在有限次計算后得出結果
漢諾塔問題:對漢諾塔問題的求解,可以通過以下3個步驟實現(xiàn):
(1)將塔上的n-1個碟子借助塔C先移到塔B上;
(2)把塔A上剩下的一個碟子移到塔C上;
(3)將n-1個碟子從塔B借助塔A移到塔C上。
在遞歸函數(shù)中,調(diào)用函數(shù)和被調(diào)用函數(shù)是同一個函數(shù),需要注意的是遞歸函數(shù)的調(diào)用層次,如果把調(diào)用遞歸函數(shù)的主函數(shù)稱為第0層,進入函數(shù)后,首次遞歸調(diào)用自身稱為第1層調(diào)用;從第i層遞歸調(diào)用自身稱為第i+1層。反之,退出第i+1層調(diào)用應該返回第i層。采用圖示方法描述遞歸函數(shù)的運行軌跡,從中可較直觀地了解到各調(diào)用層次及其執(zhí)行情況,具體方法如下:
(1)寫出函數(shù)當前調(diào)用層執(zhí)行的各語句,并用有向弧表示語句的執(zhí)行次序;
(2)對函數(shù)的每個遞歸調(diào)用,寫出對應的函數(shù)調(diào)用,從調(diào)用處畫一條有向弧指向被調(diào)用函數(shù)入口,表示調(diào)用路線,從被調(diào)用函數(shù)末尾處畫一條有向弧指向調(diào)用語句的下面,表示返回路線;
(3)在返回路線上標出本層調(diào)用所得的函數(shù)值。n=3時漢諾塔算法的運行軌跡如下圖所示,有向弧上的數(shù)字表示遞歸調(diào)用和返回的執(zhí)行順序
三、遞歸函數(shù)的內(nèi)部執(zhí)行過程
一個遞歸函數(shù)的調(diào)用過程類似于多個函數(shù)的嵌套的調(diào)用,只不過調(diào)用函數(shù)和被調(diào)用函數(shù)是同一個函數(shù)。為了保證遞歸函數(shù)的正確執(zhí)行,系統(tǒng)需設立一個工作棧。具體地說,遞歸調(diào)用的內(nèi)部執(zhí)行過程如下:
(1)運動開始時,首先為遞歸調(diào)用建立一個工作棧,其結構包括值參、局部變量和返回地址;
(2)每次執(zhí)行遞歸調(diào)用之前,把遞歸函數(shù)的值參和局部變量的當前值以及調(diào)用后的返回地址壓棧;
(3)每次遞歸調(diào)用結束后,將棧頂元素出棧,使相應的值參和局部變量恢復為調(diào)用前的值,然后轉(zhuǎn)向返回地址指定的位置繼續(xù)執(zhí)行。
上述漢諾塔算法執(zhí)行過程中,工作棧的變化如下圖所示,其中棧元素的結構為(返回地址,n值,A值,B值,C值),返回地址對應算法中語句的行號,分圖的序號對應圖中遞歸調(diào)用和返回的序號
我可以幫助你,你先設置我最佳答案后,我百度Hii教你。
c語言怎么用遞歸函數(shù)
首先是要這個求解的問題,適合用遞歸方法來進行求解。找到這個遞歸解法結束遞歸的條件。遞歸函數(shù)中,首先第一個語句就是如果滿足遞歸條件,就直接返回確定的值,否則返回使用遞歸方法求解的表達式。
c語言中的遞歸函數(shù)
1、用在出口條件上
if(n==1) return x;
if(n1) x=(x+1)*fun(x,n-1);正確可以實現(xiàn)遞歸功能
2、用在出口條件和繼續(xù)遞歸的調(diào)用上(實際上還是在出口條件)
if(n==1) return x;
if(x1) return (x+1)*fun(x,n-1);正確這個也可以實現(xiàn)遞歸功能
3、在設置一個值,用這個值來判斷,最終還是能實現(xiàn)遞歸
int m;
if(n==1) m=x;
if (n1) m=(x+1)*fun(x,n-1);
return m;
萬變不離其蹤,return 永遠用在函數(shù)的出口條件上,沒有return就死循環(huán)了不是么?
講一下c語言中遞歸函數(shù)的使用方法
相當于循環(huán),要有判斷條件,傳遞進去的參數(shù)要變化,滿足條件調(diào)用自身,不滿足條件就開始一層一層返回。簡單例子:
int
f(int
i){
int
sum=0;
if(i0)
sum+=f(i-1);
return
sum;
}
main(){
int
a=10;
printf("%d",f(a));
}
在c語言中如何使用遞歸函數(shù)
遞歸,是函數(shù)實現(xiàn)的一個很重要的環(huán)節(jié),很多程序中都或多或少的使用了遞歸函數(shù)。遞歸的意思就是函數(shù)自己調(diào)用自己本身,或者在自己函數(shù)調(diào)用的下級函數(shù)中調(diào)用自己。
遞歸之所以能實現(xiàn),是因為函數(shù)的每個執(zhí)行過程都在棧中有自己的形參和局部變量的拷貝,這些拷貝和函數(shù)的其他執(zhí)行過程毫不相干。這種機制是當代大多數(shù)程序設計語言實現(xiàn)子程序結構的基礎,是使得遞歸成為可能。假定某個調(diào)用函數(shù)調(diào)用了一個被調(diào)用函數(shù),再假定被調(diào)用函數(shù)又反過來調(diào)用了調(diào)用函數(shù)。這第二個調(diào)用就被稱為調(diào)用函數(shù)的遞歸,因為它發(fā)生在調(diào)用函數(shù)的當前執(zhí)行過程運行完畢之前。而且,因為這個原先的調(diào)用函數(shù)、現(xiàn)在的被調(diào)用函數(shù)在棧中較低的位置有它獨立的一組參數(shù)和自變量,原先的參數(shù)和變量將不受影響,所以遞歸能正常工作。程序遍歷執(zhí)行這些函數(shù)的過程就被稱為遞歸下降。
程序員需保證遞歸函數(shù)不會隨意改變靜態(tài)變量和全局變量的值,以避免在遞歸下降過程中的上層函數(shù)出錯。程序員還必須確保有一個終止條件來結束遞歸下降過程,并且返回到頂層。
文章標題:c語言中利用函數(shù)遞歸 什么是函數(shù)的遞歸調(diào)用c語言
轉(zhuǎn)載來源:http://www.dlmjj.cn/article/hhohge.html