溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Hanoi塔問(wèn)題怎么解決

發(fā)布時(shí)間:2021-12-17 16:20:41 來(lái)源:億速云 閱讀:105 作者:iii 欄目:云計(jì)算

這篇文章主要介紹“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í)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI