为什么此代码抛出StackOverflowError

时间:2016-01-30 14:10:07

标签: java stack-overflow

我想做一种寻路。然后我使用FIFO队列从一个单元格中分配一个距离编号,如果它们有一个默认编号,则对它们的邻居进行递归处理。

在小空间它工作正常但我不明白为什么当我尝试更高的空间(100x100)时它会抛出StackOverflowError。

我的位置类只是(X,Y)的元组。

有人知道出了什么问题?我以为我的LinkedList只会浏览整个空间并停止它。

public class Main {

    public static int[][] cells; //[Y][X]
    public static LinkedList<Position> modifiedCells = new LinkedList<Position>();


    public static void assignNumber(int posX, int posY) {
        int currentNumber = cells[posX][posY]+1;

        int globalX, globalY;
        for (int x = posX-1; x <= posX+1; x++) {
            for (int y = posY-1; y <= posY+1; y++) {
                if(y>=0 && y< cells[0].length && x>=0 && x<cells.length && cells[x][y] == 0)   { 
                    //out of border or still 0.
                    cells[x][y] = currentNumber;
                    modifiedCells.addLast(new Position(x,y));
                }
            }
        }

        if(modifiedCells.size() > 0){ 
            //take the next cell on list and assign number on neighbors
            Position pos = modifiedCells.removeFirst();
            assignNumber(pos.getX(),pos.getY());
        }
    }

    public static void main(String[] args) {

        cells = new int[100][100];

        for (int x = 0; x < 100; x++) {
            for (int y = 0; y < 100; y++) {
                cells[x][y] = 0;
            }
        }
        assignNumber(50,50);
    }
}

1 个答案:

答案 0 :(得分:2)

默认的最大堆栈(即递归)深度为1000. 100 x 100将导致深度为10000.

随着问题空间的增长,某些算法(例如此算法)无法很好地扩展。

要使其正常工作,您可以尝试设置更大的堆栈大小:

from sklearn.decomposition import TruncatedSVD
svd = TruncatedSVD(n_components=5)
svd.fit_transform(mat_tmp)