好的,所以我在河内塔问题上有一个任务。我得到了代码,并让它工作,但我只是不知道它背后发生了什么。有人可以解释一下吗?我不理解solveTower(num-1, from, other, to)
和solveTower(1, from, to, other)
以及solveTower(num-1, other, to, from)
的行。我理解它在做什么,它只是使用另一个将磁盘的数量从一个挂钩移动到另一个挂钩。我只是不明白它背后发生了什么。就像为什么我必须将num-1
磁盘从左侧挂钩移动到中间位置,将最大磁盘从左侧挂钉移动到右侧挂钩,并将num-1
磁盘从中间向右移动?为什么我不能像solveTower(num, from, to, other)
那样说出将所有磁盘从左侧挂钩移动到右侧挂钩?
这是我的司机:
public class Hanoi_Driver
{
public static void main(String[] args)
{
Tower tower = new Tower();
tower.solveTower();
}
}
这是我的目标:
import java.util.Scanner;
public class Tower
{
private int size;
private String fromPeg = "A";
private String toPeg = "C";
private String otherPeg = "B";
public Tower()
{
this.size = size;
this.fromPeg = fromPeg;
this.toPeg = toPeg;
this.otherPeg = otherPeg;
}
public void solveTower()
{
Scanner keyboard = new Scanner(System.in);
System.out.println("What do you want the size to be?");
size = keyboard.nextInt();
System.out.println("Steps for solving " + size + " disk tower of hanoi puzzle, ");
solveTower(size, fromPeg, toPeg, otherPeg);
}
private void solveTower(int num, String from, String to, String other) {
if (num == 1) {
System.out.println("Move disk from " + from +
" to " + to + ".");
}
else {
solveTower(num-1, from, other, to);
solveTower(1, from, to, other);
solveTower(num-1, other, to, from);
}
}
}
答案 0 :(得分:0)
这些行
solveTower(num-1, from, other, to);
solveTower(1, from, to, other);
solveTower(num-1, other, to, from);
表示如果尚未找到解决方案(else
的{{1}},换言之,num == 1
或实际上num > 1
时),那么#1:移动除了num < 1
到num-1
之外的所有人(from
)(而非other
),#2:将剩余的一个移到正确的目标to
上, #3:将原来的to
移回other
。
每次,第三个参数都是要使用的额外挂钩
当你从这里开始:
to
你说&#34;解决整个问题&#34;。
对solveTower`的其他递归调用将问题分解为更小的部分。
这对我来说很好用:
solveTower(size, fromPeg, toPeg, otherPeg);
如果大小超过3,那么解决问题的步骤就会变得更加复杂。尺寸1和2工作正常,但尺寸0未正确处理。 (对于0或更小的尺寸,解算器中没有检查。)
您可以在Tower构造函数中删除一些不必要的代码;它只需要:
公共塔楼() { }
您可以关闭扫描仪键盘:
What do you want the size to be?
3
Steps for solving 3 disk tower of hanoi puzzle,
Move disk from A to C.
Move disk from A to B.
Move disk from C to B.
Move disk from A to C.
Move disk from B to A.
Move disk from B to C.
Move disk from A to C.