您好,登錄后才能下訂單哦!
這篇文章主要介紹“Hanoi塔問題怎么解決”,在日常操作中,相信很多人在Hanoi塔問題怎么解決問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Hanoi塔問題怎么解決”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
Hanoi塔問題——遞歸方法求解
假設有三個分別命名為x、y、z的圓柱形塔座,在塔座x上插有n個半徑大小各不相同,以小到大由上而下編號為1,2,····,n,如圖所示。現在要求將X軸上的n個圓盤移至塔Z上并仍按原來的順序疊放,圓盤移動時必須遵循以下規則:
1.每次只能移動一個圓盤
2.圓盤可以插在X、Y、Z任意一個塔座上
3.任何時刻都不能將一個較大的圓盤壓在較小圓盤之上
如何實現圓盤的移動呢?這就要用到我們強大的遞歸思想。設一個變量n用來調用任意一個圓盤,當n=1時,只要將一號圓盤從X上移動到Z上即可;當n>1,需要利用Y做中間塔,若能設法將壓在n號盤上的n-1個圓盤從X移至Y上,然后再將n號盤移到Z上,最后將Y上的n-1個圓盤移到Z上即可!而整個過程中對那n-1個圓盤進行的兩次整體操作都可以分別作為一個完整的Hanoi問題。
由此求解的C函數如下:
void move(char a,int n,char c)
{
//此函數的操作為:將a塔上編號為n的圓盤移至c塔上
//此處省略若干字。。。
}
void Hanoi(int n,char a,char b,char c)
//將塔座a上的n個圓盤搬到c上,b作為中間塔
{
if(n==1)move(x,1,z);
else
{
Hanoi(n-1,x,z,y);
move(x,n,z);
Hanoi(n-1,y,x,z);
}
}
可以看出,整個程序都不需要用到實際用于存放Hanoi塔的存儲空間(因為算法與客觀存在的數據無關嘛),所以move函數可以寫成:printf(“將%i號盤從%c塔移到%c塔”,n,a,c);
到此,關于“Hanoi塔問題怎么解決”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。