操作步骤
- 当n为1时直接将盘子从第一个柱子移动到第三个柱子。
- 当 n>1时,先借助第三个柱子将n-1个盘子移动到第二个柱子,然后将第n个盘子从第一个柱子移动到第三个柱子,最后借助第一个柱子将在第二个柱子上的n-1个盘子移动到第三个柱子上。
在这里将将柱子依次记为x,y,z。
代码
#include<stdio.h>
void move(char x, int n, char z) {
printf("%d,%c --> %c\n", n, x, z);
}
void hanoi(int n, char x, char y, char z) {
if (n == 1) { //递归终止条件
move(x, 1, z); //将编号为1的圆盘从 x移至z
return;
}
else {
hanoi(n - 1, x, z, y); //将第n个圆盘上边的n-1个圆盘,借助z移到y
move(x, n, z); //这个时候还有1个,为第n个,将由x其移到z
hanoi(n - 1, y, x, z); //这个时候将n-1个在y上边的圆盘借助x移到z
}
}
int main() {
int n;
scanf_s("%d", &n);
hanoi(n, 'x', 'y', 'z');
return 0;
}
以3个盘子来举个例子。记住递归过程就像在栈上进行操作一样。产生一个记录就压入栈顶,没退出一层递归就从栈顶弹出一个工作记录。