java - 需要一些关于递归的解释吗?

标签 java

我仍然无法理解汉诺塔递归这个古老的问题它在这里是如何工作的。我已经从理论上阅读了它,但我仍然不明白这里如何调用递归。如果环的值为 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/

相关文章:

java - 基于用户输入 key 的加密

java - 获取数据在 JTable 中的位置

Java多线程应用程序如何阻止对象给别人?

java - 从 XSD 将命名空间添加到 XML

java - 从java中的arrayList打印数组

java - keystore 异常 : getting null key

java - 如何计算价格通过从firebase数据库检索一个值并通过elegantNumberButton检索其他值

java - 无法在 Eclipse Indigo 中运行 JUnit

java - 实现保持状态的 Quartz 作业的推荐方法

java - 在多个文本框中显示堆栈项目