河内塔递归java

时间:2013-05-11 03:42:07

标签: java recursion

这是我使用递归解决河内塔的Java代码:

/**here is a stack of N disks on the first of three poles (call
them A, B and C) and your job is to move the disks from pole A to pole B without
ever putting a larger disk on top of a smaller disk.*/ 

public class Hanoi {

    public static void main(String[] args) {
        playHanoi (2,"A","B","C");
    }

    //move n disks from position "from" to "to" via "other"
    private static void playHanoi(int n, String from , String other, String to) {
        if (n == 0)
            return;
        if (n > 0)
        playHanoi(n-1, from, to, other);
        System.out.printf("Move one disk from pole %s to pole %s \n ", from, to);
        playHanoi(n-1, other, from, to);
    }

}

我把打印方法的地方重要吗?另外,我可以这样做:

    playHanoi(n-1, from, to, other);
    playHanoi(n-1, other, from, to);
    System.out.printf("Move one disk from pole %s to pole %s \n ", from, to);

2 个答案:

答案 0 :(得分:11)

以这种方式解决Tower of Hanoy问题,只不过是定义了如何完成工作的策略。你的代码:

    playHanoi(n-1, from, to, other);
    System.out.printf("Move one disk from pole %s to pole %s \n ", from, to);
    playHanoi(n-1, other, from, to);

基本上将您的策略​​定义为喜欢以下,

  1. n-1 磁盘从 “从” (源塔)移至 “其他” (中间塔)。
  2. 然后将 n 磁盘从 “从” (源塔)移至 “to” (目的地塔)。
  3. 最后将 n-1 磁盘从 “其他” (中间塔)移至 < em>“to” (目的地塔)。
  4. 您的prinf基本上执行 2 步骤。

    现在,如果你编写这样的代码:

        playHanoi(n-1, from, to, other);
        playHanoi(n-1, other, from, to);
        System.out.printf("Move one disk from pole %s to pole %s \n ", from, to);
    

    然后你基本上在做:

    1. n-1 磁盘从 “从” (源塔)移至 “其他” (中间塔)。
    2. 然后将 n-1 磁盘从 “其他” (中间塔)移至 < em>“to” (目的地塔)。
    3. 最后将 n 磁盘从 “从” (源塔)移至 “to” (目的地塔)。

        

      在此策略中,执行 2 步骤后(从<移动所有 n-1 磁盘) strong> “其他” “到” ), 3 rd步骤变为无效(移动 n 磁盘从 “从” “到” < / STRONG>)!因为在Tower of Hanoy中你不能把较大的磁盘放在较小的磁盘上!

    4. 因此,选择第二个选项(策略)会导致您采用无效策略,这就是您不能这样做的原因!

答案 1 :(得分:1)

确实很重要。在递归调用之后的任何内容都将在递归之后执行(以及之前的任何内容),因此您可能会发现输出是无意义的顺序。

请记住,函数调用之后的语句在函数返回之前不会执行。