遞迴求解漢諾塔問題

2021-09-24 18:15:43 字數 1085 閱讀 7281

漢諾塔:漢諾塔(tower of hanoi)源於印度傳說中,大梵天創造世界時造了三根金鋼石柱子,其中一根柱子自底向上疊著64片**圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。

遞迴的思路就是把問題簡化到更小規模的問題,在寫程式的時候確定兩個目標。一是如何分解乙個問題,二是當該問題分解到最簡時如何處理,將這兩塊內容通過程式告訴電腦,就可以把任務推給電腦,由電腦來解決「具體如何遞推、如何回歸」的問題。

問題:在漢諾塔問題中,假設有a、b、c三根柱子,一開始只有a柱子上由上到下從小到大擺放了n個圓盤,要借助b柱子將a柱子上的圓盤由移動到c柱子上,還是按由上到下從小到大擺放。

思路:這個問題可以按照遞迴的思路進行簡化,當搬到最後一步時,也就是當n-1的盤子全部按順序擺放在c上,只剩最小的那個盤子還在a上,那麼只需要將最後乙個盤子從a挪到c就可以了,這就確定了問題分解到最簡時該如何處理。

那麼如何分解這個問題呢,想要達到「n-1的盤子全部桉順序擺放在c上,只剩最小的盤子還在a上」這種情況,首先需要達到「n-1-1的盤子全部按順序擺放在c上,只剩倒數第二小的盤子在b上,最小的盤子在a上」…

也就是說,如果要把乙個n層漢諾塔從a搬到c,如果前n-1層可以找別人搞定,我們只管搬第n層,就會變得非常容易,把漢諾塔的前n-1層看成乙個整體,把這個整體搬到b,然後把最下面的第n層搬到c,然後再把前n-1層從b搬到c。

那麼如果接到「搬前n-1層」這個任務的是我們,該怎麼搬呢?只需要和以前一樣,把前n-2層交給別人,然後自己搬第n-1層,然後接到「搬n-2層」的再把前n-3層交給別人…以此類推下去,最終會有乙個「人」接到了「搬第一層」的任務,他搬完這個簡單的任務之後上乙個人就能完成自己的任務…於是問題解決

c語言實現:

#include

void

move

(char a,

char b)

void

hanoit

(int n,

char a,

char b,

char c)

else

}int

main()

漢諾塔問題求解(遞迴)

人工智慧,零基礎入門!例項說明 漢諾塔問題的描述如下 有a b和c 3跟柱子,在a上從下往上按照從小到大的順序放著64個圓盤,以b為中介,把盤子全部移動到c上。移動過程中,要求任意盤子的下面要麼沒有盤子,要麼只能有比它大的盤子。本例項將演示如何求解3階漢諾塔問題。實現過程 新建乙個類hanoitow...

求解漢諾塔的遞迴問題

先上 void towersofhanoi int n,int x,int y,int z 這裡也分基礎部分和遞迴部分,但是這裡的基礎部分並不明顯,這裡的基礎部分就是當x上的碟數為1時,if裡面的第一和第三句 直接退出,只有第二句 會執行。這裡的第二句 就是基礎部分,然後老規矩迭代部分我們只需要考慮...

漢諾塔問題求解

漢諾塔問題求解 問題描述 a,b,c三個柱子,其中a插著n個盤子從上到下按照小到大放,嘗試以b盤子為中介,每次移一次,將a中的盤子從上到下按照小到大插 演算法 n個盤子全放在a上面,分為兩步走 將前面 n 1 個盤子全部放到b上面,然後將第n個盤子放到c中 這樣子b中就有 n 1 個盤子,再以a為中...