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