使用阵列打印河内塔的每一步

时间:2016-11-01 09:05:15

标签: java debugging towers-of-hanoi

我正在尝试使用一系列物体打印河内塔的每一步。我正在使用的对象是只有名字的Pokemon对象。它确实具有与此代码无关的其他属性。我只用名字对塔进行排序。 Pokemon对象数组按字母顺序排序,使用以下代码:

for ( int i = 0; i<pokemon.length;i++){
    for ( int j = i+1; j<pokemon.length; j++){
        if ( (pokemon[j].getName().compareTo(pokemon[i].getName())<0)){
            String temp = pokemon[i].getName();
            pokemon[i].setName(pokemon[j].getName());
            pokemon[j].setName(temp);
        }
    }
}

在正确排序数组之后,我创建了这个打印方法,以显示正在发生的河内塔进程。

static public void printArray(int n, Pokemon[] a, Pokemon[] b, Pokemon[] c) {
    String slot1 = "";
    String slot2 = "";
    String slot3 = "";
    System.out.println("A\t\tB\t\tC");
    for (int i = 0; i < n; i++) {
        if (!a[i].getName().equals("")) {
            slot1 = a[i].getName();
            if (!b[i].getName().equals("")) {
                slot2 = b[i].getName();
                if (!c[i].getName().equals("")) {
                    slot3 = c[i].getName();
                } else
                    slot3 = "";
            } else
                slot2 = "";
        } else
            slot1 = "";
        System.out.println(slot1 + "\t\t" + slot2 + "\t\t" + slot3);
    }

}

我知道使用\ t格式化是一个糟糕的选择,但出于调试目的,这是现在的功能,我希望将其转换为printf以获得更好的格式。 printArray方法的目的是从上到下的视图打印A B C数组。

对于数组中没有名称的每个元素,即它从未设置为任何名称,它不会打印它。这样它只会打印正在发生的“动作”。我已经通过使用带有随机字符串和空字符串(“”)的setName来验证这一点,看它是否正确打印,确实如此。

接下来,我决定对实际的递归方法本身进行一次尝试,结果就是这个混乱

static public void Hanoi(int n, Pokemon[] a, Pokemon[] b, Pokemon[] c){

    int a1 =n;
    int b1 =n-1;
    int c1 =n-1;
    for ( int i = 0; i < n;i++){
        if ( !a[i].getName().equals("")){
            a1--;
        }
        if ( !b[i].getName().equals("")){
            b1--;
        }
        if ( !c[i].getName().equals("")){
            c1--;
        }

    }

    if ( n > 0 ){
        printArray(n, a, b,c);
        Hanoi(n-1, a, c, b);
        c[c1].setName(a[a1].getName());CC
        a[a1].setName("");

        Hanoi(n-1,b, a, c);
        System.out.println("\n\n\n");

    }
}

N是用户输入的数字('磁盘数')

我也应该对此发表评论,但我倾向于在评论之前确保我的程序正常运行并让一切变得混乱。 if语句的要点是,如果数组中已有名称,则递减每个单独数组(A,B,C)的索引计数器。从字面上看,索引越高意味着堆栈的底部。

我现在相当迷失,不知道要检查什么,但我正在尽我所能处理小错误测试,但如果有人有这方面的经验并给我一些建议或指出一些东西,我将不胜感激!

注意:我现在正在学习OOP,所以我的工具仅限于我们已经学过的东西,因此我正在尝试用我已经知道的数据来处理河内塔递归方法。

编辑:对不起,这是深夜,我非常疲惫,并没有想清楚地发布逻辑问题。我遇到的问题是追溯我的逻辑。当我进入递归函数调用时,我感到困惑。

如果我输入一个3,最简单的河内塔问题,那么我得到这个样本输出

3
A       B       C
Bulbasaur               
Pikachu             
Squirtle                
A       B       C
Bulbasaur               
Pikachu             
A       B       C
Bulbasaur               

方法调用是

Hanoi(3,pokemon,b,c)

追溯逻辑我最终得到a1 = 0,b1,= 2和c1 = 2,这与所有索引的第一次打印相对应

 A      B       C
Bulbasaur               
Pikachu             
Squirtle            

这是我感到困惑的地方,当我打电话给河内(n-1,a,c,b)代码最终在最外面的循环完成之前打印2次?如果是这样,我无法决定将print语句放在何处,因为我需要输出只在每次更改时打印一次。

对于常规的河内塔,我想我理解印刷线

System.out.println("Moving a stack from", A, C)

然而,在处理数组时,我需要在C数组的某处设置一个值并从A数组中删除一个值,从而有效地导致“移动”,我在行中

c[c1].setName(a[a1].getName());
a[a1].setName("");

如果在递归函数调用之后发生这种逻辑,那是否意味着它首先解析最内层的循环?那么当n = 1时?此时我完全迷失了,因为我知道用

调用递归函数
Hanoi(n-1,a,c,b)

意味着每次它都会切换目的地和辅助阵列时,我无法绕过这个。我在哪里使用print语句。递归函数调用如何影响我的磁盘移位,是否有更好的方法来处理Tower of Hanoi with Arrays,然后使用单独的索引来跟踪每个Array,因为它似乎在Arrays从他们的原来的位置。

0 个答案:

没有答案