我仍然有问题要理解河内塔的古老问题它在这里如何运作。我从理论上读到了它,但我仍然没有得到如何在这里调用递归。如果ring的值为2,任何人都可以解释每个步骤的内容。
一般来说,我知道它自称的递归,但在这里我被卡住了:
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s = new Scanner(System.in);
System.out.println("Input the number of rings");
int rings = s.nextInt();
move(rings, 'A', 'B', 'C');
}
public static void move(int rings, char x, char y, char z){
if(rings > 0){
move(rings - 1, x, z, y);
System.out.println("Move ring " + rings + " from peg " + x + " to " + y + ".");
move(rings - 1, z, y, x);
}
}
为什么当我给戒指值1时,它直接进入这一行:
System.out.println("Move ring " + rings + " from peg " + x + " to " + y + ".");
谢谢。
答案 0 :(得分:2)
当ring的值为1时,会发生以下情况:
使用rings = 1的方法调用 -move方法
- 条件得到满足(因为1> 0为真)所以用ring = 0
来调用move
- 另一个move方法的实例开始,但这次ring = rings - 1 = 0
- 条件不满足(因为0> 0为假)所以没有任何反应,并且该方法结束了
- 我们回到了方法的第一个实例。现在,执行系统调用
- 之后,再次调用move,ring = rings - 1 = 0
- 该方法的另一个实例开始,并且再次满足条件(0> 0为假),因此该方法终止而不进入“if”块
如果环等于2,则会发生同样的情况,但会发生更大,更复杂的递归树。环为2的移动方法将调用2个移动方法,其中环等于1,这将自己调用2个移动方法,每个方法的环为0。
2
/ \
1 1
/ \ / \
0 0 0 0
一步一步地,当ring = 2时,会发生这种情况:
-move(1,x,z,y);
-move(0,x,z,y);
-System.out.println(“将环1从桩A移动到C”);
-move(0,z,y,x);
-System.out.println(“将环2从桩A移动到B”);
-move(1,z,y,x);
-move(0,x,z,y);
-System.out.println(“将环1从挂钩C移动到B”);
-move(0,z,y,x);
每次通话中响铃的值会给你一个暗示它发生的位置。例如,
移动(1,x,z,y);发生在ring = 2的方法中,因为调用是移动的(ring-1,x,z,y)。
我希望这会有所帮助。