n 階 Hanoi 塔問題假設有三個分別命名爲 X、Y 和 Z 的塔座,在塔座 X 上插有 n 個直徑大小各不相同、從小到大編號爲 1,2,...,n 的圓盤,以下圖所示。spa
圖. Hanoi 塔問題code
現要求將 X 塔上的 n 個圓盤移動到 Z 上並仍按一樣的順序疊放,圓盤移動時必須遵循下列規則:
• 每次只能移動一個圓盤;
• 圓盤能夠插在 X、Y 和 Z 中的任一塔座上;
• 任什麼時候刻都不能將一個較大的圓盤壓在較小的圓盤之上。blog
遞歸代碼以下:遞歸
1 hanoi.c 2 3 4 /* 5 * @brief 將塔座 x 上按直徑有小到大且自上而下編號 6 * 爲 1 至 n 的 n 個圓盤按規則搬到塔座 z 上,y 可用作輔助塔座. 7 * @param[in] n 圓盤個數 8 * @param[in] x 源塔座 9 * @param[in] y 輔助塔座 10 * @param[in] z 目標塔座 11 * @return 無 12 * @note 無 13 * @remarks 無 14 */ 15 void hanoi(int n, char x, char y, char z) 16 { 17 if(n == 1) 18 19 { 20 /* 移動操做 move(x,n,z) 可定義爲(c 是初始值爲的全局變量,對搬動計數) 21 printf("%i. Move disk %i from %c to %c\n", ++c, n, x, z); 22 */ 23 move(1, x, z); /* 將編號爲 1 的圓盤從 x 移動到 z */ 24 return; 25 } 26 27 else 28 29 { 30 /* 將 x 上編號 1 至 n-1 的圓盤移到 y,z 做輔助塔 */ 31 hanoi(n-1, x, z, y); 32 move(n,x,z); /* 將編號爲 n 的圓盤從 x 移到 z */ 33 /* 將 y 上編號至 n-1 的圓盤移到 z,x 做輔助塔 */ 34 hanoi(n-1, y, x, z); 35 } 36 }