數(shù)據(jù)結(jié)構(gòu)與算法9-遞歸

遞歸方法就是直接或者間接的調(diào)用自己拧抖,它可以將一些發(fā)雜問題簡化煤搜。

遞歸在下列方法中經(jīng)常會用到:

  • 定義是遞歸的。

如斐波拉契數(shù)列唧席、階乘等擦盾。

  • 數(shù)據(jù)結(jié)構(gòu)是遞歸的嘲驾。

數(shù)據(jù)結(jié)構(gòu)本身具有遞歸性,如鏈表迹卢、樹等辽故。

  • 問題的解法是遞歸的。

有一類問題腐碱,雖然問題本身沒有明顯的遞歸結(jié)構(gòu)誊垢,但采用遞歸求解比迭代求解更簡單。如漢諾塔問題症见、八皇后問題喂走、迷宮問題。

所有的遞歸都能用循環(huán)解決

分治法

在求解4!時谋作,我們會先求解3!缴啡,然后再進(jìn)一步分解進(jìn)行求解,這種求解叫做分治法瓷们。

使用分治法需要滿足3個條件:

  • 能將一個問題轉(zhuǎn)換成一個小問題业栅,新問題和原問題的解法相同或類同。不同的只是被處理的對象谬晕,并且這些處理更小且變化是有規(guī)律的碘裕。
  • 可以通過上述轉(zhuǎn)換而使得問題簡化。
  • 必須有一個明確的遞歸出口攒钳,或成為遞歸邊界帮孔。
漢諾塔問題

在經(jīng)典漢諾塔問題中,有 3 根柱子及 N 個不同大小的穿孔圓盤不撑,盤子可以滑入任意一根柱子文兢。一開始,所有盤子自上而下按升序依次套在第一根柱子上(即每一個盤子只能放在更大的盤子上面)焕檬。

移動圓盤時受到以下限制:

  • 每次只能移動一個盤子姆坚;
  • 盤子只能從柱子頂端滑出移到下一根柱子;
  • 盤子只能疊在比它大的盤子上实愚。

解決思路
我們使用遞歸來解決:

  • n=1時兼呵,直接把盤子從A移動到C就行了。(遞歸邊界)
  • n>1時:
    • 先把n-1個盤子從A移動到B腊敲;(子問題击喂,遞歸)
    • 將最大的盤子從A移動到C;
    • 再將B上n-1個盤子移動到C碰辅。(子問題懂昂,遞歸)
用棧解決
static void move(LinkStack *A, LinkStack *B, LinkStack *C, int n) {
    if (n == 1) {
        int elem;
        Pop(A, &elem);
        Push(C, elem);
    } else {
          // 把棧A中n-1個盤子放到棧B
        move(A, C, B, n - 1);
        // A棧出棧放入C棧
        int elem;
        Pop(A, &elem);
        Push(C, elem);
          // 把棧B中n-1個盤子放到棧C
        move(B, A, C, n - 1);
    }
}

void hanoi(LinkStack *A, LinkStack *B, LinkStack *C) {
    move(A, B, C, StackLength(*A));
}

int main(int argc, const char * argv[]) {
    int n = 5;
    LinkStack A, B, C;
    InitStack(&A);
    InitStack(&B);
    InitStack(&C);
    for (int i = n; i > 0; i--) {
        Push(&A, i);
    }
    printf("原始棧A:");
    StackTraverse(A);
    printf("原始棧C:");
    StackTraverse(C);
    
    hanoi(&A, &B, &C);
    
    printf("移動后棧A:");
    StackTraverse(A);
    printf("移動后棧C:");
    StackTraverse(C);
    
    return 0;
}
// 輸出
原始棧A:1 2 3 4 5 
原始棧C:
移動后棧A:
移動后棧C:1 2 3 4 5 
移動過程
void hanoi2(char *A, char *B, char *C, int n) {
    if (n == 1) {
        printf("move %s to %s\n", A, C);
    } else {
        hanoi2(A, C, B, n - 1);
        printf("move %s to %s\n", A, C);
        hanoi2(B, A, C, n - 1);
    }
}
int main(int argc, const char * argv[]) {
    hanoi2("a", "b", "c", 3);
    return 0;
}
// 輸出
move a to c
move a to b
move c to b
move a to c
move b to a
move b to c
move a to c
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市没宾,隨后出現(xiàn)的幾起案子凌彬,更是在濱河造成了極大的恐慌潮尝,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饿序,死亡現(xiàn)場離奇詭異勉失,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)原探,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門乱凿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咽弦,你說我怎么就攤上這事徒蟆。” “怎么了型型?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵段审,是天一觀的道長。 經(jīng)常有香客問我闹蒜,道長寺枉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任绷落,我火速辦了婚禮姥闪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘砌烁。我一直安慰自己筐喳,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布函喉。 她就那樣靜靜地躺著避归,像睡著了一般。 火紅的嫁衣襯著肌膚如雪管呵。 梳的紋絲不亂的頭發(fā)上梳毙,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機(jī)與錄音撇寞,去河邊找鬼顿天。 笑死,一個胖子當(dāng)著我的面吹牛蔑担,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咽白,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼啤握,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了晶框?” 一聲冷哼從身側(cè)響起排抬,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤懂从,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蹲蒲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體番甩,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年届搁,在試婚紗的時候發(fā)現(xiàn)自己被綠了缘薛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡卡睦,死狀恐怖宴胧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情表锻,我是刑警寧澤恕齐,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站瞬逊,受9級特大地震影響显歧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜确镊,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一追迟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骚腥,春花似錦敦间、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至契沫,卻和暖如春带猴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背懈万。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工拴清, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人会通。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓口予,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涕侈。 傳聞我的和親對象是個殘疾皇子沪停,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

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