我正在尝试使用一系列物体打印河内塔的每一步。我正在使用的对象是只有名字的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从他们的原来的位置。