Hanoi问题
n 阶 Hanoi 塔问题假设有三个分别命名为 X、Y 和 Z 的塔座,在塔座 X 上插有 n 个直径大小各不相同、从小到大编号为 1,2,...,n 的圆盘,如下图所示。
图. Hanoi 塔问题
现要求将 X 塔上的 n 个圆盘移动到 Z 上并仍按同样的顺序叠放,圆盘移动时必须遵循下列规则:
• 每次只能移动一个圆盘;
• 圆盘可以插在 X、Y 和 Z 中的任一塔座上;
• 任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。
递归代码如下:
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 }