成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

漢諾塔問(wèn)題

RayKr / 453人閱讀

摘要:概述漢諾塔是一個(gè)經(jīng)典的遞歸問(wèn)題,雖說(shuō)看人家寫好的算法程序就那么幾行,但著實(shí)理解有一定的難度。查閱了一些資料,參閱別人的思路,對(duì)漢諾塔算法進(jìn)行一番梳理。問(wèn)題來(lái)源有一個(gè)梵塔,塔內(nèi)有三個(gè)座,座上有若干個(gè)盤子,盤子大小不等,大的在下,小的在上如圖。

概述

漢諾塔是一個(gè)經(jīng)典的遞歸問(wèn)題,雖說(shuō)看人家寫好的算法程序就那么幾行,但著實(shí)理解有一定的難度。查閱了一些資料,參閱別人的思路,對(duì)漢諾塔算法進(jìn)行一番梳理。

問(wèn)題來(lái)源

有一個(gè)梵塔,塔內(nèi)有三個(gè)座A、B、C,A座上有若干個(gè)盤子,盤子大小不等,大的在下,小的在上(如圖)。

需要把這些個(gè)盤子從A座移到C座,中間可以借用B座,但每次只允許移動(dòng)一個(gè)盤子,并且在移動(dòng)過(guò)程中,3個(gè)座上的盤子始終保持大盤在下,小盤在上。

實(shí)例

我們從簡(jiǎn)單的來(lái)看一下如何移動(dòng)。

只有一個(gè)盤子

傻子也知道,直接移動(dòng)到C座就OK了。

有兩個(gè)盤子 [1 2]

把1移動(dòng)到B

把2移動(dòng)到C

把1移動(dòng)到C

有三個(gè)盤子 [1 2 3]

把1移動(dòng)到C

把2移動(dòng)到B

把1移動(dòng)到B

把3移動(dòng)到C

把1移動(dòng)到A

把2移動(dòng)到C

把1移動(dòng)到C

雖說(shuō)好像感覺(jué)有一定規(guī)律,但好像說(shuō)不出來(lái)個(gè)所以然。

規(guī)律

對(duì)于上面的例子,我們可以總結(jié)出兩點(diǎn):

最后一步肯定是把1移動(dòng)到C

如果盤子數(shù)大于1(1就直接移了),肯定要把最大的盤子上面的全部盤子放到B上,然后將最大的放到C上

由上面的兩點(diǎn),我們來(lái)探究一下遞歸關(guān)系。

假設(shè)有n個(gè)盤子,分別標(biāo)記為 [1 2 3... n] 大數(shù)表示大盤子,已經(jīng)在A座上放好。

初始狀態(tài)

A:有n個(gè)盤子
B:空
C:空

我們現(xiàn)在有一個(gè)方法:hanoi(int n, String a, String b, String c) ,作用就是將n個(gè)盤子從a座借助b座移動(dòng)到c座。

我們先不考慮它是怎么移過(guò)去的。

下面我們使用這個(gè)方法,結(jié)合上面我們總結(jié)的規(guī)律進(jìn)行移動(dòng)盤子。

第一步,將[1 2 3... n-1]個(gè)盤子從A移動(dòng)到B上,再將 n 盤子移動(dòng)到C上

hanoi(n-1, A, C, B)
// 將A上的n-1個(gè)盤子移動(dòng)到B上
hanoi(1, A, B, C)
// 將A上的一個(gè)盤子移動(dòng)到C

現(xiàn)在我們的盤子情況為

A:空
B:有n-1個(gè)盤子
C:最大的n盤子

由于最大的n盤子上可以放任何盤子,你可以完全忽略它的存在,不用管它,這時(shí)候的情形(忽略n盤子的存在)是不是跟初始狀態(tài)類似呢(一個(gè)有盤子,其余的沒(méi)有盤子)?是的,只不過(guò)順序發(fā)生的變化并且盤子的數(shù)量減少了一個(gè)。

我們的總盤子數(shù)為:n-1

我們的B座就是初始狀態(tài)的A座,A座就是初始狀態(tài)的B座,C座還是C座。

第二步,將B座上的[1 2 3... n-1-1] 從B移動(dòng)到A上,將n-1盤子從B移動(dòng)到C

hanoi(n-2, B, C, A)
// 將B上的n-1-1個(gè)盤子移動(dòng)到A上
hanoi(1, B, A, C)
// 將B上的一個(gè)盤子移動(dòng)到C

現(xiàn)在我們的盤子情況為

A:有n-1-1個(gè)盤子
B:空
C:最大的n盤子和倒數(shù)第二個(gè)n-1盤子

C上的盤子已經(jīng)擺好,可以認(rèn)為是空座,是不是又回到了初始狀態(tài)的情形呢?是的,盤子數(shù)減一。

第三步,將A座上的[1 2 3... n-2-1] 從A移動(dòng)到B上,將n-2盤子從A移動(dòng)到C

hanoi(n-3, A, C, B)
// 將A上的n-2-1個(gè)盤子移動(dòng)到A上
hanoi(1, A, B, C)
// 將A上的一個(gè)盤子移動(dòng)到C

又回到類似第一步執(zhí)行后的情形了,如此反復(fù),直到所有盤子都成功移動(dòng)到C上為止。

經(jīng)過(guò)上述的推敲,我們知道,每經(jīng)過(guò)一步,盤子數(shù)少一個(gè),并且A和B兩座的位置互換(這里指他們輪流充當(dāng)初始狀態(tài)A的角色)。

代碼實(shí)現(xiàn)(Java)
public static void hanoi(int n, String a, String b, String c) {
    if (n == 1) {
        System.out.println("將" + a + "最上面的盤子移動(dòng)到" + c);
        return;
    }
    // 當(dāng)前盤子在a上,將當(dāng)前盤子數(shù)-1放到b上
    hanoi(n-1, a, c, b);
    // 剩下一個(gè)放到c上
    hanoi(1, a, b, c);
    // 當(dāng)前盤子在b上,b是下一輪的a, a b 換位置,進(jìn)行下一輪
    hanoi(n-1, b, a, c);
}

調(diào)用:

hanoi(1, "A", "B", "C");
// 將A最上面的盤子移動(dòng)到C

hanoi(2, "A", "B", "C");
// 將A最上面的盤子移動(dòng)到B
// 將A最上面的盤子移動(dòng)到C
// 將B最上面的盤子移動(dòng)到C

hanoi(3, "A", "B", "C");
// 將A最上面的盤子移動(dòng)到C
// 將A最上面的盤子移動(dòng)到B
// 將C最上面的盤子移動(dòng)到B
// 將A最上面的盤子移動(dòng)到C
// 將B最上面的盤子移動(dòng)到A
// 將B最上面的盤子移動(dòng)到C
// 將A最上面的盤子移動(dòng)到C

解釋一下a b cA B C的關(guān)系

A B C是實(shí)際的盤子座,a b c表示的是一種狀態(tài),即初始狀態(tài)a 表示有待移動(dòng)的若干個(gè)盤子的座,b c始終表示空座(c上可能有盤子,但已經(jīng)擺好,可以認(rèn)為為空)。

每移動(dòng)一輪,A座與B座交換存盤子,若A有盤子,A就是參數(shù)a,若B有盤子,B就是參數(shù)a,C位置不動(dòng)。

總之a 始終代表堆著盤子的座。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65418.html

相關(guān)文章

  • 【程序員必會(huì)十大算法】之分治算法(漢諾問(wèn)題

    摘要:應(yīng)用分治法是一種很重要的算法。字面上的解釋是分而治之,就是把一個(gè)復(fù)雜的問(wèn)題分成兩個(gè)或更多的相同或相似的子問(wèn)題,再把子問(wèn)題分成更小的子問(wèn)題直到最后子問(wèn)題可以簡(jiǎn)單的直接求解,原問(wèn)題的解即子問(wèn)題的解的合并。 ...

    codecraft 評(píng)論0 收藏0
  • 數(shù)據(jù)結(jié)構(gòu)與算法之漢諾問(wèn)題(Java遞歸)

    摘要:漢諾塔問(wèn)題有三根柱子,源桿,暫存桿,目的桿上有層盤子,由小到大向下排列,現(xiàn)需要將桿的盤子移到桿中要求大的盤在下面,小的盤在上面一次只能移動(dòng)一個(gè)盤子個(gè)人思路先分析問(wèn)題,用數(shù)學(xué)的歸納法當(dāng)只有一個(gè)盤時(shí),直接移動(dòng)當(dāng)有兩個(gè)盤時(shí),先將小的移到暫存桿,再 漢諾塔問(wèn)題: 有三根柱子,源桿A,暫存桿temp,目的桿C A上有n層盤子,由小到大向下排列,現(xiàn)需要將A桿的盤子移到C桿中 ...

    yuxue 評(píng)論0 收藏0
  • 漢諾算法

    摘要:漢諾塔問(wèn)題描述有三個(gè)圓柱,其中上從上至下放置了從小到大個(gè)圓盤,一次只能移動(dòng)一個(gè)圓盤,且大的圓盤不能放在小圓盤之上,要求打印出從將圓盤移到的方案。 漢諾塔問(wèn)題描述:有A, B, C三個(gè)圓柱,其中A上從上至下放置了從小到大n個(gè)圓盤,一次只能移動(dòng)一個(gè)圓盤,且大的圓盤不能放在小圓盤之上,要求打印出從A將圓盤移到C的方案。 當(dāng)n = 1時(shí), A->C當(dāng)n = 2時(shí), A->B, A->C, B-...

    UsherChen 評(píng)論0 收藏0
  • 經(jīng)典算法:漢諾

    摘要:學(xué)編程,學(xué),算法也是必不可缺的,這一次給大家?guī)?lái)一個(gè)經(jīng)典的遞歸算法題,漢諾塔。當(dāng)我們把層都搬到了中間柱的時(shí)候,只需要把最大的那個(gè)盤,從搬到柱就好了,剩下的怎么辦呢柱永遠(yuǎn)是目標(biāo)柱,我們不需要去移動(dòng)它。 學(xué)編程,學(xué)IT,算法也是必不可缺的,這一次給大家?guī)?lái)一個(gè)經(jīng)典的遞歸算法題,漢諾塔。算是算法的入門小題目之一吧~ 視頻教程 什么是漢諾塔? 我這里直接拉來(lái)一個(gè)圖解釋一下(掛了請(qǐng)聯(lián)系我)sho...

    Lin_R 評(píng)論0 收藏0
  • 經(jīng)典算法:漢諾

    摘要:學(xué)編程,學(xué),算法也是必不可缺的,這一次給大家?guī)?lái)一個(gè)經(jīng)典的遞歸算法題,漢諾塔。當(dāng)我們把層都搬到了中間柱的時(shí)候,只需要把最大的那個(gè)盤,從搬到柱就好了,剩下的怎么辦呢柱永遠(yuǎn)是目標(biāo)柱,我們不需要去移動(dòng)它。 學(xué)編程,學(xué)IT,算法也是必不可缺的,這一次給大家?guī)?lái)一個(gè)經(jīng)典的遞歸算法題,漢諾塔。算是算法的入門小題目之一吧~ 視頻教程 什么是漢諾塔? 我這里直接拉來(lái)一個(gè)圖解釋一下(掛了請(qǐng)聯(lián)系我)sho...

    AWang 評(píng)論0 收藏0
  • 用C程序解決漢諾問(wèn)題與青蛙跳臺(tái)階問(wèn)題(遞歸)

    摘要:由此可知在前柱是中轉(zhuǎn)柱在之后也有兩種情況只有上有圓盤。并且我們的游戲目標(biāo)從一開(kāi)始的把上所有圓盤移到柱變成了把上所有圓盤移到柱上而在這時(shí)中轉(zhuǎn)柱是柱。現(xiàn)在將步驟分為三個(gè)小步驟將上個(gè)圓盤全部移到柱上中轉(zhuǎn)柱柱。 一.漢諾塔問(wèn)題 ? 漢諾塔是一種古印度游戲,該游戲的實(shí)質(zhì)就是在一塊木板上有三根固定的柱子...

    villainhr 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<