2016-01-30 2 views
1

Я хочу сделать своего рода поиск путей. Затем я использовал очередь FIFO, чтобы назначить номер расстояния из ячейки и сделать это рекурсивно для своих соседей, если у них есть номер по умолчанию.Почему этот код бросает StackOverflowError

На небольшом пространстве он работает нормально, но я не понимаю, почему он бросает StackOverflowError, когда я пытаюсь использовать более высокое пространство (100x100).

Класс «Моя позиция» - это всего лишь кортеж (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); 
    } 
} 
+3

Вашего размера стека не бесконечен, так что если ваш метод требует слишком много рекурсивных вызовов, что стек может переполниться. «StackOverflowError» не обязательно означает, что у вас есть бесконечный цикл. – Tom

+0

О, спасибо, ладно, я думаю, что понял. Я не могу сделать рекурсивный вызов более чем на тысячу «уровней». Мне там лучше делать то, что я хочу на большом пространстве в рекурсивном методе, или я должен попробовать итеративно и отказаться от рекурсивного? – dufaux

+0

Я сделал это взамен. Спасибо за объяснение stackOverflowError :). – dufaux

ответ

2

По умолчанию максимальный стек (т.е. рекурсия) глубина 1000 100 х 100 приведет к глубине 10000.

Некоторые алгоритмы (такие как этот) не масштабируется как проблема пространства растет.

Чтобы заставить его работать, вы можете попробовать установить больший размер стека:

java -Xss1G com.mypackage.Main 
Смежные вопросы