遞歸

概念

什么是遞歸锦担?一個方法在方法內(nèi)部直接或間接調(diào)用自身方法俭识。

應(yīng)用場景

下面3中情況,我們通常使用遞歸解決問題

1.定義是遞歸的

例如斐波拉契數(shù)列

long Fib(Long n){ 
 if(n == 1 || n == 2) return 1;
 else return Fib(n-1)+Fib(n-2);
}

對于類似這種復(fù)雜問題洞渔,若能夠分解成幾個簡單揭發(fā)相同或類似的子問題來求解套媚,便成為遞歸求解
采取分治法進行遞歸求解的問題需要滿足以下三個條件:

  • 能講一個問題轉(zhuǎn)換成一個小問題。而新問題和原問題揭發(fā)相同或雷同磁椒。不同的僅僅是處理的對象堤瘤,并且這些處理更小且變化有規(guī)律的
  • 可以通過上述轉(zhuǎn)換而使得問題簡化
  • 必須有一個明確的遞歸出口,或成為二遞歸邊界

2.數(shù)據(jù)結(jié)構(gòu)是遞歸的

其數(shù)據(jù)結(jié)構(gòu)本身具有遞歸的特性
例如浆熔,對于鏈表本辐,其結(jié)點LNode的定義由數(shù)據(jù)域data和指針域next組成,而指針域next是一種指向LNode類型的指針蘸拔,即LNode的定義中又用到了其自身师郑,所以鏈表是一種遞歸的數(shù)據(jù)結(jié)構(gòu)

void TraverseList(LinkList p){
//
if(p == NULL) return; else{
// printf("%d",p->data); //p TraverseList(p->next);
}
10 11 }

3环葵、問題的解法是遞歸的

有一類問題调窍,雖然問題本身并沒有明顯的遞歸結(jié)構(gòu),但是采用遞歸求解比迭代求解更簡單张遭,如Hanoi塔問題邓萨,八皇后問題,迷宮問題

遞歸過程與遞歸工作棧

一個遞歸函數(shù)菊卷,在函數(shù)的執(zhí)行過程中缔恳,需要多次進行自我調(diào)用。遞歸函數(shù)是如何執(zhí)行的洁闰?
在高級語言的程序中歉甚,調(diào)用函數(shù)和被調(diào)用的函數(shù)之間的鏈接與信息交換都是通過棧來進行的
通常,當(dāng)在一個函數(shù)的運行期間調(diào)用另一個函數(shù)時扑眉,在運行被調(diào)用函數(shù)之前纸泄,系統(tǒng)需要先完成3件事情:

  • 將所有的實參赖钞、返回地址等信息傳遞給被調(diào)用函數(shù)保存
  • 為被調(diào)用函數(shù)的局部變量分配存儲空間
  • 將控制轉(zhuǎn)移到被調(diào)用函數(shù)入口
    而從被調(diào)用函數(shù)返回到調(diào)用函數(shù)之前,系統(tǒng)同樣需要完成3件事
  • 不存被調(diào)用函數(shù)的計算結(jié)果
  • 釋放被調(diào)用函數(shù)的數(shù)據(jù)區(qū)
  • 依照被調(diào)用函數(shù)保存的返回地址將控制器移動到調(diào)用函數(shù)

當(dāng)多個函數(shù)構(gòu)成嵌套調(diào)用時聘裁,按照“先調(diào)用后返回”的原則雪营,上述函數(shù)之間的信息傳遞和控制轉(zhuǎn)移必須通過“棧”來實現(xiàn)衡便。即系統(tǒng)將整個程序運行時的所需要的數(shù)據(jù)空間都安排在一個棧中献起,每當(dāng)調(diào)用一個函數(shù)時,就在他的棧頂分配一個存儲區(qū)镣陕。每當(dāng)整個函數(shù)退出時谴餐,就釋放它的存儲區(qū)。則當(dāng)前運行時的函數(shù)的數(shù)據(jù)區(qū)必在棧頂

一個遞歸函數(shù)的運行過程類似多個函數(shù)嵌套調(diào)用茁彭,只是調(diào)用函數(shù)和被調(diào)用函數(shù)是同一個函數(shù)总寒。因此,和每次調(diào)用相關(guān)的一個重要概念是遞歸函數(shù)運行的層次理肺。假設(shè)調(diào)用該遞歸函數(shù)的主函數(shù)是第0層摄闸,則從主函數(shù)調(diào)用遞歸函數(shù)進入第一層,從第i層遞歸調(diào)用本函數(shù)為下一層妹萨。即第i+1層年枕。反正退出第i層遞歸應(yīng)返回上一層,即第i-1層乎完。

為了保證遞歸函數(shù)正確執(zhí)行熏兄,系統(tǒng)需要設(shè)立一個“遞歸工作棧”作為整個遞歸函數(shù)運行期間使用的數(shù)據(jù)存儲區(qū)树姨,每一層遞歸所需信息構(gòu)成一個工作記錄摩桶,其中包括所有的實參,所有的局部變量以及上一層的返回地址帽揪。每進入一層遞歸硝清,就產(chǎn)生一個新的工作記錄壓入棧頂。每退出一個遞歸转晰,就從棧頂彈出一個工作記錄芦拿,則當(dāng)前執(zhí)行層的工作記錄必須是遞歸工作棧頂?shù)墓ぷ饔涗洠Q為活動記錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末查邢,一起剝皮案震驚了整個濱河市蔗崎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扰藕,老刑警劉巖缓苛,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異邓深,居然都是意外死亡未桥,警方通過查閱死者的電腦和手機番官,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钢属,“玉大人徘熔,你說我怎么就攤上這事∠常” “怎么了酷师?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長染乌。 經(jīng)常有香客問我山孔,道長,這世上最難降的妖魔是什么荷憋? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任台颠,我火速辦了婚禮,結(jié)果婚禮上勒庄,老公的妹妹穿的比我還像新娘串前。我一直安慰自己,他們只是感情好实蔽,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布荡碾。 她就那樣靜靜地躺著,像睡著了一般局装。 火紅的嫁衣襯著肌膚如雪坛吁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天铐尚,我揣著相機與錄音拨脉,去河邊找鬼。 笑死宣增,一個胖子當(dāng)著我的面吹牛玫膀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播统舀,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼匆骗,長吁一口氣:“原來是場噩夢啊……” “哼劳景!你這毒婦竟也來了誉简?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤盟广,失蹤者是張志新(化名)和其女友劉穎闷串,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體筋量,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡烹吵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年碉熄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肋拔。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡锈津,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凉蜂,到底是詐尸還是另有隱情琼梆,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布窿吩,位于F島的核電站茎杂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏纫雁。R本人自食惡果不足惜煌往,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望轧邪。 院中可真熱鬧刽脖,春花似錦、人聲如沸忌愚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽菜循。三九已至翘地,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間癌幕,已是汗流浹背衙耕。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留勺远,地道東北人橙喘。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像胶逢,于是被迫代替她去往敵國和親厅瞎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容