Java 求解河内塔之谜的递归方法
我正试图解决“河内塔”问题,即通过辅助堆栈将磁盘堆栈从最小到最大从开始堆栈移动到目标堆栈,而无需将较大的磁盘放在较小的磁盘上 他给了我算法:Java 求解河内塔之谜的递归方法,java,algorithm,recursion,towers-of-hanoi,Java,Algorithm,Recursion,Towers Of Hanoi,我正试图解决“河内塔”问题,即通过辅助堆栈将磁盘堆栈从最小到最大从开始堆栈移动到目标堆栈,而无需将较大的磁盘放在较小的磁盘上 他给了我算法: If numberDisks == 1: Display “Move the top disk from S to D”. Else Move(numberDisks -1, ‘S’, ‘A’, ‘D’); Move(1, ‘S’, ‘D’, ‘A’); Move(numberDisks -1, ‘A’, ‘D’, ‘S’); 然而
If numberDisks == 1:
Display “Move the top disk from S to D”.
Else
Move(numberDisks -1, ‘S’, ‘A’, ‘D’);
Move(1, ‘S’, ‘D’, ‘A’);
Move(numberDisks -1, ‘A’, ‘D’, ‘S’);
然而,这似乎不同于大多数其他似乎不使用Move(1,'S','D','A')的方法;在递归函数中
就我的代码而言,我似乎在重复每一步的基本情况,我不确定如何构造我的print语句以提供正确的输出,它应该如下所示:
Move disk 1 from S to D
Move disk 2 from S to A
Move disk 1 from D to A
Move disk 3 from S to D
Move disk 1 from A to S
Move disk 2 from A to D
Move disk 1 from S to D
尝试移动3个磁盘时
// Recursively solve Towers of Hanoi puzzle
public static void main(String[] args) {
if (handleArguments(args)) {
System.out.println("numDisks is ok");
int numDisks = Integer.parseInt(args[0]);
Move(numDisks,'s', 'a', 'd' );
}
}
// recursive case
public static void Move(int disks, char start, char aux, char destination) {
// base case
if (disks == 1) {
System.out.println("Move disk 1 from S to D");
// if number of disks is 2 or greater
} else if(disks > 1) {
Move(disks - 1, start, aux, destination);
System.out.println("move disk " + disks + " from " + start + " to " + destination);
Move(1, start, destination, aux);
Move(disks - 1, aux, destination, start);
}
}
第一件事:了解移动n张光盘的算法(从S到D,带A)
Move(1,开始,目标,辅助)代码>在我的步骤3和4之间。这就是为什么要重复基本情况,因为要显式地调用、重复基本情况,但这样做没有任何意义
我看到的另一个主要问题是:
System.out.println(“将磁盘1从S移到D”)
将始终按顺序打印“S”和“D”,当您经常需要指定不同的移动时,请确保使用此语句的参数
我不认为还有别的,但是试试看
作为对你在文章开头给出的例子的回应。它产生的输出与您的版本略有不同
您指定(或尝试)在每个步骤中移动的光盘大小,本示例仅指定将光盘从哪个堆栈移动到哪个堆栈,而不考虑其大小
以1为中间变量的递归调用将打印移动指令以移动栈中的最后一个磁盘(我的步骤3)。
我读了两遍,我仍然不清楚你的问题。你能考虑重新调整你的问题,并清楚地突出你的问题吗?@ USSRES44685当然,我的递归函数要求用户输入他们想要放入的磁盘的数量,并逐步地告诉你从1到N从上到下移动的磁盘以移动所有的磁盘到目的地针。然而,它会重复我的每一步基本情况,并不会正确打印出要采取的步骤。我似乎仍然得到一个奇怪的@ShahobMousavi,请详细说明。你改变了什么,你的新输出是什么?你认为是什么导致它不正确?(如果您需要添加格式良好的信息,可以编辑您的问题)@ShahobMousavi您应该重新查看递归调用以及定义中参数的顺序。(还有您的特殊案例打印行中的空格)