演算法:漢諾塔(棧的遞迴呼叫)-資料結構(9)
阿新 • • 發佈:2019-01-09
一、問題描述
參見網上漢諾塔的玩法。書上P54-58。解析:棧的遞迴呼叫其實是函式引數是以棧的形式push進棧來呼叫函式的,因此遞迴是用到棧的,只是沒有很形象而已。解決漢塔的思路是這樣的:設n為漢諾塔的盤子數,xyz是三根柱子。要讓z有n個盤子的做法,先是將x的n-1個盤子移到y,然後將第n個盤子移到z,就這樣的思路進行下去,最後就可以把漢諾塔的問題解決了。二、演算法實現
int c = 0; void move(char x,int n,char z){ printf("%d Move dist %d from %c to %c \n",++c,n,x,z); } void hanoi(int n,char x,char y,char z){ //漢諾塔的盤的個數n x,y,z分別是柱子 if (n == 1) { //移動一個情況下 直接移動 move(x, 1, z);//將1號圓盤 從x放到z } else{ hanoi(n-1,x,z,y);//將x上的n-1個盤子 放到y上 move(x,n,z);//然後將第n個盤子放到z上 hanoi(n-1,y,x,z);//將y上的n-1個盤子放到z上 } }
三、執行
//漢諾塔
hanoi(3, 'x', 'y', 'z');
輸出:
1 Move dist 1 from x to z
2 Move dist 2 from x to y
3 Move dist 1 from z to y
4 Move dist 3 from x to z
5 Move dist 1 from y to x
6 Move dist 2 from y to z
7 Move dist 1 from x to z
請按任意鍵繼續. . .