一、問題大意
大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規定,任何時候,在小圓盤上都不能放大圓盤,且在三根柱子之間一次只能移動一個圓盤。問應該如何操作?(百度百科)現要求寫出一個代碼,表明移動圓盤的過程。
二、大致思路
?遞歸的問題不用想的很復雜,這道題目在思考起來,應該從最后的結果入手:除最小的圓盤外,其他的圓盤已經在第三根柱子上了,而且按照從小到大的順序排列著,現在只需要將最后一個并且是最小的圓盤移到第三根柱子上就大功告成了。
我的代碼是用A、B、C三個字母代表三根柱子,A->B表示從把A的圓盤移到B上。既然是遞歸,那么就得思考一下遞歸到何時,遞歸終止。要說終止,上文已經說了,最小的那一個圓盤落在第三根柱子上就終止了。也就是n等于1時終止,那么具體的移動過程是一個什么樣的思路呢?
假設:
我們已經擁有了解決這個問題的函數hannuota(int n,char A,char B,char C)
a、那么,依照上述綠色的文字,我們需要把n-1個圓盤通過C移動到B后,最大的那一個圓盤才能移動到C上,所以就有:
hannuota(n-1,A,C,B);?
b、然后顯示A->C上"printf("%c->%c\n",A,C);"這里看似是A->C,其實是由傳遞到A、C對應位置的參數確定的,所以也就可以輸出移動過程。(我覺得這是本題最巧妙的存在)
b、最大的圓盤移動到C上之后,B上的剩余的圓盤需要借助A移動到C上。所以就有:hannuota(n-1,B,A,C)
?這樣就解決問題啊!
三、具體實現
#include<stdio.h>
#include<stdlib.h>
int hannuota(int n, char A, char B, char C)//用大寫的ABC代替漢諾塔的三根柱子
{if (n == 1)printf("%c->%c\n", A, C); //當n=1時,直接把盤子從A移動到C,//也是遞歸終止的條件else{hannuota(n - 1, A, C, B); //把A的n-1個盤子通過C移動到Bprintf("%c->%c\n", A, C); //顯示從A移動到C的所有的圓盤的過程,因為傳參的不同//所以可以顯示過程hannuota(n - 1, B, A, C); //把B上面的n-1個盤通過A移動到C}return 0;
}int main()
{printf("請輸入漢諾塔的層數:\n");int n;scanf("%d", &n);printf("漢諾塔移動過程:\n");hannuota(n, 'A', 'B', 'C');system("pause");return 0;
}
四、實驗結果?