我仍然无法理解汉诺塔递归这个古老的问题它在这里是如何工作的。我已经从理论上阅读了它,但我仍然不明白这里如何调用递归。如果环的值为 2,任何人都可以解释一下 ex 的每一步发生了什么。
一般来说,我知道它会调用自己的递归,但在这里我陷入困境:
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 + ".");
谢谢。
最佳答案
当rings的值为1时,会发生以下情况:
-move方法被调用,rings = 1
- 满足条件(因为 1 > 0 为真),因此调用 move 并使用ring = 0
- move 方法的另一个实例启动,但这次响起 = 响起 - 1 = 0
- 不满足条件(因为 0 > 0 为假),所以什么也没有发生,该方法结束
-我们回到了该方法的第一个实例。现在,系统调用被执行
- 之后,再次调用 move,rings=rings-1=0
-该方法的另一个实例启动,并且条件再次不满足(0 > 0 为假),因此该方法在不进入“if” block 的情况下终止
如果环等于 2,也会发生同样的情况,但会出现更大、更复杂的递归树。环数为 2 的移动方法将调用 2 个环数等于 1 的移动方法,这两个移动方法本身将调用 2 个环数为 0 的移动方法。
2
/ \
1 1
/ \ / \
0 0 0 0
一步一步,环= 2,这会发生:
-移动(1,x,z,y);
-移动(0,x,z,y);
-System.out.println("将环 1 从钉 A 移动到 C。");
-移动(0, z, y, x);
-System.out.println("将环 2 从钉 A 移至 B。");
-移动(1,z,y,x);
-移动(0,x,z,y);
-System.out.println("将环 1 从桩 C 移至 B。");
- 移动(0, z, y, x);
每次通话中响铃的值都会提示您通话发生的位置。例如,
移动(1,x,z,y);发生在ring = 2的方法中,因为调用的是move(rings-1, x, z, y)。
我希望这会有所帮助。
关于java - 需要一些关于递归的解释吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9245433/