汉诺塔问题
—韩顺平java30讲学习
问题描述
将如图所示A中所有的圆盘移到c中,要求不能大盘压小盘
解决思路
使用递归:
- 将5个盘移动到C(move(5,A,B,C)):
- 首先将上面四个盘移动到B
move(4,A,C,B),将4个盘从A移动到B,借助C - 再将A中最大盘移动到C中
A->C - 最后将B上的4个盘移动到C
move(4,B,A,C),将4个盘从B移动到C,借助A
- 首先将上面四个盘移动到B
- 上述第一个步骤中的 move(4,A,C,B)同样分为三步骤:
- 首先将上面是三个盘移动到C
move(3,A,B,C),将3个盘从A移动到C,借助B - 再将A中最大盘移动到B
A->B - 最后将C上的3个盘子移动到B上
move(3,C,A,B),将3个盘从C移动到B,借助A
- 首先将上面是三个盘移动到C
由以上步骤可以退出,无论几个盘,都是先移到这个,再移到那个,步骤都一样,可以用递归,直到只有一个盘的时候,直接移动。
代码
move(5 , A , B , C)
public void move(int num , char A1 , char B1, char C1 ){
if(num == 1){
System.out.println(A1 + "->" + C1);
} else {
move(num-1 , A1 , C1 , B1);
printf(A1 + "->" + C1);
move(num-1 , B1 , A1 , C1);
}
}