題目來自百度百科:
漢諾塔:漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞着64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
c語言實現(假設最開始放64片黃金圓盤的柱子為A, 要移動到C柱子上,借助的介質為B柱子):
1 #include <stdio.h>
2 /*
3 * 偽算法(要移動盤子的柱子為A,借助的介質柱子為B,移動到目的柱子為C.
4 * 如果盤子數為1,則直接將盤子從A柱子移到C柱子。
5 * 否則:
6 * step1:將A柱子上的N-1個盤子借助於C柱子移動到B柱子上。
7 * step2:將A柱子上的第N個盤子直接移動到C柱子上。
8 * step3:將B柱子上的N-1個盤子借助A柱子移動到C柱子上。
9 */
10
11 void hanoi( int n, char A, char B, char C) {
12 if ( 1 == n) {
13 printf( " 將編號為%d的盤子從%c柱子直接移動到%c柱子\n ", n, A, C);
14 } else {
15 hanoi(n - 1, A, C, B);
16 printf( " 將編號為%d的盤子從%c柱子直接移動到%c柱子\n ", n, A, C);
17 hanoi(n - 1, B, A, C);
18 }
19 }
20 int main( void) {
21 char A = ' A ';
22 char B = ' B ';
23 char C = ' C ';
24
25 int n;
26
27 printf( " 請輸入柱子的個數: ");
28 scanf( " %d ", &n);
29
30 hanoi(n, A, B, C);
31
32 return 0;
33 }
2 /*
3 * 偽算法(要移動盤子的柱子為A,借助的介質柱子為B,移動到目的柱子為C.
4 * 如果盤子數為1,則直接將盤子從A柱子移到C柱子。
5 * 否則:
6 * step1:將A柱子上的N-1個盤子借助於C柱子移動到B柱子上。
7 * step2:將A柱子上的第N個盤子直接移動到C柱子上。
8 * step3:將B柱子上的N-1個盤子借助A柱子移動到C柱子上。
9 */
10
11 void hanoi( int n, char A, char B, char C) {
12 if ( 1 == n) {
13 printf( " 將編號為%d的盤子從%c柱子直接移動到%c柱子\n ", n, A, C);
14 } else {
15 hanoi(n - 1, A, C, B);
16 printf( " 將編號為%d的盤子從%c柱子直接移動到%c柱子\n ", n, A, C);
17 hanoi(n - 1, B, A, C);
18 }
19 }
20 int main( void) {
21 char A = ' A ';
22 char B = ' B ';
23 char C = ' C ';
24
25 int n;
26
27 printf( " 請輸入柱子的個數: ");
28 scanf( " %d ", &n);
29
30 hanoi(n, A, B, C);
31
32 return 0;
33 }
結果:
1 E:\tarbitrary\datastructure\recursion>gcc hanoi.c -o hanoi
2
3 E:\tarbitrary\datastructure\recursion>hanoi
4 請輸入柱子的個數: 3
5 將編號為1的盤子從A柱子直接移動到C柱子
6 將編號為2的盤子從A柱子直接移動到B柱子
7 將編號為1的盤子從C柱子直接移動到B柱子
8 將編號為3的盤子從A柱子直接移動到C柱子
9 將編號為1的盤子從B柱子直接移動到A柱子
10 將編號為2的盤子從B柱子直接移動到C柱子
11 將編號為1的盤子從A柱子直接移動到C柱子
2
3 E:\tarbitrary\datastructure\recursion>hanoi
4 請輸入柱子的個數: 3
5 將編號為1的盤子從A柱子直接移動到C柱子
6 將編號為2的盤子從A柱子直接移動到B柱子
7 將編號為1的盤子從C柱子直接移動到B柱子
8 將編號為3的盤子從A柱子直接移動到C柱子
9 將編號為1的盤子從B柱子直接移動到A柱子
10 將編號為2的盤子從B柱子直接移動到C柱子
11 將編號為1的盤子從A柱子直接移動到C柱子