我一直在使用堆栈在河内递归塔上工作,但是我收到了OutOfMemoryError:河内函数中的Java堆空间
import java.util.Scanner;
import java.util.Stack;
public class Hanoi {
public static Stack<Integer>[] towersOfHanoi = new Stack[4];
public static int moves;
public static void hanoi(int n) {
for(int i = 0; i <= 3; i++) {
towersOfHanoi[i] = new Stack<Integer>();
}
for(int i = n; n > 0; i--) {
towersOfHanoi[1].push(i);
}
moveDisc(n, 1, 2, 3);
}
public static void moveDisc(int n, int peg1, int peg2, int peg3) {
moveDisc(n-1, peg1, peg2, peg3);
int i = towersOfHanoi[peg1].pop();
towersOfHanoi[peg2].push(i);
moves++;
moveDisc(n-1, peg3, peg1, peg2);
}
public static void main(String args[]) {
Scanner in = new Scanner(System.in);
towersOfHanoi[1] = new Stack<Integer>();
towersOfHanoi[2] = new Stack<Integer>();
towersOfHanoi[3] = new Stack<Integer>();
System.out.println("Enter number of discs: ");
int n = in.nextInt();
in.close();
hanoi(n);
System.out.println(moves);
}
}
答案 0 :(得分:2)
问题出在河内函数的第二个for循环中
MARKDOWN = {
'output_format': 'xhtml'
}
应该是
for(int i = n; n > 0; i--) {
towersOfHanoi[1].push(i);
}
在您将其设置为“ n> 0”之前,但n永远不会改变。您希望它为“ i> 0”
我还应该提到,您可能会在moveDisk方法中获得无限递归。您应该做一个基础案例。但是,这将解决您在hanoi函数中遇到的OOM错误
答案 1 :(得分:0)
public static void moveDisc(int n, int peg1, int peg2, int peg3) {
moveDisc(n-1, peg1, peg2, peg3);
...
方法moveDisc
立即重新调用自身,而没有任何测试来破坏递归。因此,您可以无限递归并迅速耗尽所有堆栈空间。
这个问题的算法在Internet上有很多地方有据可查。
答案 2 :(得分:0)
这是因为您的代码将运行无限递归。 我不完全记得河内求解方法,但是从它的外观来看,您试图运行基于'n'的递归算法,但您从未检查过基本条件,例如当n达到1或0时;