我在尝试用int值填充堆栈数组时遇到OutOfMemoryError

时间:2018-08-08 03:15:04

标签: java stack

我一直在使用堆栈在河内递归塔上工作,但是我收到了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);


    }
}

3 个答案:

答案 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时;