C语言(CED)递归实现汉诺塔问题
一、問(wèn)題大意
大梵天創(chuàng)造世界的時(shí)候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開(kāi)始按大小順序重新擺放在另一根柱子上。并且規(guī)定,任何時(shí)候,在小圓盤上都不能放大圓盤,且在三根柱子之間一次只能移動(dòng)一個(gè)圓盤。問(wèn)應(yīng)該如何操作?(百度百科)現(xiàn)要求寫(xiě)出一個(gè)代碼,表明移動(dòng)圓盤的過(guò)程。
二、大致思路
?遞歸的問(wèn)題不用想的很復(fù)雜,這道題目在思考起來(lái),應(yīng)該從最后的結(jié)果入手:除最小的圓盤外,其他的圓盤已經(jīng)在第三根柱子上了,而且按照從小到大的順序排列著,現(xiàn)在只需要將最后一個(gè)并且是最小的圓盤移到第三根柱子上就大功告成了。
我的代碼是用A、B、C三個(gè)字母代表三根柱子,A->B表示從把A的圓盤移到B上。既然是遞歸,那么就得思考一下遞歸到何時(shí),遞歸終止。要說(shuō)終止,上文已經(jīng)說(shuō)了,最小的那一個(gè)圓盤落在第三根柱子上就終止了。也就是n等于1時(shí)終止,那么具體的移動(dòng)過(guò)程是一個(gè)什么樣的思路呢?
假設(shè):
我們已經(jīng)擁有了解決這個(gè)問(wèn)題的函數(shù)hannuota(int n,char A,char B,char C)
a、那么,依照上述綠色的文字,我們需要把n-1個(gè)圓盤通過(guò)C移動(dòng)到B后,最大的那一個(gè)圓盤才能移動(dòng)到C上,所以就有:
hannuota(n-1,A,C,B);?
b、然后顯示A->C上"printf("%c->%c\n",A,C);"這里看似是A->C,其實(shí)是由傳遞到A、C對(duì)應(yīng)位置的參數(shù)確定的,所以也就可以輸出移動(dòng)過(guò)程。(我覺(jué)得這是本題最巧妙的存在)
b、最大的圓盤移動(dòng)到C上之后,B上的剩余的圓盤需要借助A移動(dòng)到C上。所以就有:hannuota(n-1,B,A,C)
?這樣就解決問(wèn)題啊!
三、具體實(shí)現(xiàn)
#include<stdio.h> #include<stdlib.h> int hannuota(int n, char A, char B, char C)//用大寫(xiě)的ABC代替漢諾塔的三根柱子 {if (n == 1)printf("%c->%c\n", A, C); //當(dāng)n=1時(shí),直接把盤子從A移動(dòng)到C,//也是遞歸終止的條件else{hannuota(n - 1, A, C, B); //把A的n-1個(gè)盤子通過(guò)C移動(dòng)到Bprintf("%c->%c\n", A, C); //顯示從A移動(dòng)到C的所有的圓盤的過(guò)程,因?yàn)閭鲄⒌牟煌?/所以可以顯示過(guò)程hannuota(n - 1, B, A, C); //把B上面的n-1個(gè)盤通過(guò)A移動(dòng)到C}return 0; }int main() {printf("請(qǐng)輸入漢諾塔的層數(shù):\n");int n;scanf("%d", &n);printf("漢諾塔移動(dòng)過(guò)程:\n");hannuota(n, 'A', 'B', 'C');system("pause");return 0; }四、實(shí)驗(yàn)結(jié)果?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的C语言(CED)递归实现汉诺塔问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 未出账单提前还款算吗 未出账单是可以提前
- 下一篇: 登录界面验证码的实现