漢諾塔游戲的遞歸解析

遞歸

遞歸就是程序自己調(diào)用自己的過程再膳。
本身理解遞歸的思想比較容易扶檐,舉一個(gè)求階乘的例子:

def fact(n):
    if n==1:
        return 1
    return n * fact(n - 1)

測試:

>>> fact(1)
1
>>> fact(5)
120

實(shí)際上遞歸程序不可能一直遞歸循環(huán)下去空免,需要利用其它條件來結(jié)束遞歸循環(huán)。這里求階乘的例子漾岳,就是當(dāng)n==1時(shí)就結(jié)束遞歸循環(huán)。
這里以fact(5)為例粉寞,看程序是如何進(jìn)行遞歸運(yùn)行的

===> fact(5) 
===> 5 * fact(4)
===> 5 * (4 * fact(3))
===> 5 * (4 * (3 * fact(2)))
===> 5 * (4 * (3 * (2 * fact(1))))
===> 5 * (4 * (3 * (2 * 1)))
===> 5 * (4 * (3 * 2))
===> 5 * (4 * 6)
===> 5 * 24
===> 120

可以看出程序從fact(5)遞歸到fact(1)結(jié)束蝗羊。從上到下遞歸至結(jié)束,然后從下至上依次計(jì)算仁锯。

漢諾塔游戲

上面這個(gè)遞歸求階乘很好理解耀找。但是將遞歸的思想放到漢諾塔中,就不是那么容易明白了业崖。(關(guān)于漢諾塔的文章野芒,其實(shí)網(wǎng)上很多了,這里不會很詳細(xì)解說双炕。)簡單說下漢諾塔游戲的規(guī)則和玩法:

  1. 有三個(gè)柱子: a, b, c;
  2. a 上有數(shù)量為N個(gè)的圓盤狞悲;
  3. 從a柱將數(shù)量為N個(gè)的圓盤拿到 c 柱上;
  4. 一次只能拿一個(gè)圓盤妇斤,a,b,c 柱都可以利用摇锋;
  5. 無論在哪根柱子上丹拯,都是較大的圓盤永遠(yuǎn)在較小圓盤下面。

為了方便后面的理解荸恕,這里先說明幾個(gè)字母含義:

N:一個(gè)標(biāo)量乖酬,在下文中表示,第N個(gè)圓盤融求,N-1咬像,第N-1個(gè)圓盤
n: 代表前n個(gè)圓盤, n-1 代表前n-1個(gè)圓盤生宛;
a,b,c:分別表示三根柱子县昂;
—>: 箭頭表示從...移動到...

玩漢諾塔游戲可以分為三步:

  1. 將n-1個(gè)圓盤從 a 移到 b上;
  2. 將N圓盤從a 移到 c 上陷舅;
  3. 將n-1 個(gè)圓盤倒彰,從b 移到c 上。

玩漢諾塔就是不斷重復(fù)那三步莱睁,直到n-1=1待讳。

遞歸運(yùn)行圖

要將 n 個(gè)圓盤從 a 移到 c ,
則先將n-1個(gè)從a移到b缩赛,然后將N從a移動c耙箍,再將n-1從b移到c;
要將n-1個(gè)從a移到b,
則先將n-2個(gè)從a移到c酥馍,然后將N-1從a移動b辩昆,再將n-2從c移到b;
要將n-2個(gè)從a移到c,
則先將n-3個(gè)從a移到b旨袒,然后將N-2從a移動c汁针,再將n-3從b移到c;
要將n-3個(gè)從a移到b,
則先將n-4個(gè)從a移到c砚尽,然后將N-3從a移動b施无,再將n-4從c移到b;
......
在遞歸到最后一層,n- (n-1)=1, 也就是 a 柱第一個(gè)圓盤移向 b 還是 c 取決于N是奇數(shù)還是偶數(shù)必孤。(代幾個(gè)數(shù)測試下就知道了)
注:要將n-k個(gè)從一個(gè)柱子移到另一個(gè)柱子猾骡,需要借助第三個(gè)空閑柱子

紅色部分遞歸路徑,假設(shè)其為遞歸1號路線敷搪,在其下面還有其它遞歸分支(綠色表示)兴想。等紅色的從上往下遞歸到底后,程序從底下赡勘,往上開始計(jì)算嫂便,遇到綠色則開始遞歸,等綠色遞歸完后繼續(xù)計(jì)算上一層的闸与。
程序一開始的遞歸沿著紅色一直遞歸到最后一層(實(shí)際圓盤中最上面的那個(gè))不再進(jìn)行遞歸毙替,直接開始搬運(yùn)圓盤岸售。然后運(yùn)行最后一層的剩余步驟(黑色,紅色)厂画,最后一層運(yùn)行完凸丸,
等計(jì)算完,紅色部分遞歸1號路線木羹,
程序運(yùn)行N(a)->c甲雅,
然后開始藍(lán)色部分的遞歸路徑(稱其遞歸2號路線)解孙,遞歸2號路線同1號路線一樣也有許多遞歸支路坑填。

為幫助理解,下面是一個(gè)路線圖弛姜,挺丑的脐瑰,湊合看。廷臼。


運(yùn)行路線圖(T_T)

如果單純值拿紅色遞歸1號路線(不包括其遞歸支線)苍在,其實(shí)其和上面的遞歸階乘的例子是一樣的。但是漢諾塔這個(gè)有了許多遞歸支線荠商,就感覺復(fù)雜了許多寂恬。同時(shí)也可能因?yàn)閺腶->b, a->c, b->c, a->c,a-b...這三個(gè)字母混去混來的,腦袋記不住它們關(guān)系了莱没,容易犯渾初肉。但是你像圖片那樣將遞歸推導(dǎo)列出來就容易明白了。

代碼

# Python
def move(n, a, b, c):   #從a將n個(gè)圓盤到c
    if n == 1:
        print(f"{a} --> {c}")
    else:
        move(n-1, a, c, b)  #先將n-1圓盤從a移動到b
        print(f"{a} --> {c}") #然后將a移到c
        move(n-1, b, a, c) #再將n-1圓盤從b移動到c
move(4,'a', 'b', 'c')

#include <stdio.h>  
// C
void move(int, char, char, char);

void move(int n, char x, char y, char z)
{
        if (n == 1)
        {
                printf("%c --> %c\n", x, z);
        }
        else
        {
                move(n-1, x, z, y);
                printf("%c --> %c\n", x, z);
                move(n-1, y, x, z);
        }
}

int main()
{
        int n;
        scanf("%d", &n);
        move(n, 'a', 'b', 'c');
        return 0;
}

參考:

遞歸函數(shù)

原文: 漢諾塔游戲的遞歸解析

相關(guān)文章:

二叉樹與漢諾塔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饰躲,一起剝皮案震驚了整個(gè)濱河市牙咏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嘹裂,老刑警劉巖妄壶,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異寄狼,居然都是意外死亡丁寄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門泊愧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伊磺,“玉大人,你說我怎么就攤上這事拼卵∩莼耄” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵腋腮,是天一觀的道長雀彼。 經(jīng)常有香客問我壤蚜,道長,這世上最難降的妖魔是什么徊哑? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任袜刷,我火速辦了婚禮,結(jié)果婚禮上莺丑,老公的妹妹穿的比我還像新娘著蟹。我一直安慰自己,他們只是感情好梢莽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布萧豆。 她就那樣靜靜地躺著,像睡著了一般昏名。 火紅的嫁衣襯著肌膚如雪涮雷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天轻局,我揣著相機(jī)與錄音洪鸭,去河邊找鬼。 笑死仑扑,一個(gè)胖子當(dāng)著我的面吹牛览爵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播镇饮,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蜓竹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了盒让?” 一聲冷哼從身側(cè)響起梅肤,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎邑茄,沒想到半個(gè)月后姨蝴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肺缕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年左医,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片同木。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浮梢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出彤路,到底是詐尸還是另有隱情秕硝,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布洲尊,位于F島的核電站远豺,受9級特大地震影響奈偏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜躯护,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一惊来、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棺滞,春花似錦裁蚁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锰瘸,卻和暖如春刽严,著一層夾襖步出監(jiān)牢的瞬間昂灵,已是汗流浹背避凝。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留眨补,地道東北人管削。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像撑螺,于是被迫代替她去往敵國和親含思。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

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

  • 專業(yè)考題類型管理運(yùn)行工作負(fù)責(zé)人一般作業(yè)考題內(nèi)容選項(xiàng)A選項(xiàng)B選項(xiàng)C選項(xiàng)D選項(xiàng)E選項(xiàng)F正確答案 變電單選GYSZ本規(guī)程...
    小白兔去釣魚閱讀 8,988評論 0 13
  • 漢諾塔游戲甘晤,是個(gè)佷益智的游戲,其中也蘊(yùn)含了一些數(shù)學(xué)的知識含潘,故事的背景甚至蘊(yùn)含了一些古人對宇宙的思考。今天我們來聊下...
    家和萬事亨閱讀 766評論 0 1
  • 前置文章:遞歸算法:www.reibang.com/p/703069f3ba3f . 漢諾塔問題是來源于印度傳...
    郎小凱閱讀 767評論 0 1
  • 原文鏈接(轉(zhuǎn)載請注明出處)漢諾塔的圖解遞歸算法 起源 漢諾塔(又稱河內(nèi)塔)問題是源于印度一個(gè)古老傳說的益智玩具线婚。大...
    Dmego閱讀 1,544評論 0 0
  • 我的博客:遞歸之漢諾塔問題 一.起源: 漢諾塔(又稱河內(nèi)塔)問題是源于印度一個(gè)古老傳說的益智玩具遏弱。大梵天創(chuàng)造世界的...
    taylar_where閱讀 921評論 1 3