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

时间:2012-02-12 00:45:56

标签: java

我仍然有问题要理解河内塔的古老问题它在这里如何运作。我从理论上读到了它,但我仍然没有得到如何在这里调用递归。如果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 + "."); 

谢谢。

1 个答案:

答案 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)。

我希望这会有所帮助。