2017-02-14 20 views
0

EDIT Кто-то указал мне, что мне действительно нужно уйти через всю мою рекурсию, чтобы убедиться, что я попал в конечную точку, а затем начну собирать когда я возвращаюсь через стеки. Я без понятия что это значит.Создайте вектор и сохраните информацию в рамках рекурсивного метода в Java

Моя цель - создать рекурсивный метод построения пути через лабиринт, сохранить этот путь в векторе и вернуть его в конце моей рекурсии.

Мой метод запускает лабиринт, но у меня возникают трудности с сохранением списка в моем векторе, потому что мне нужно создать экземпляр каждой рекурсии.

Вот мой код (EDITED):

protected Vector<GameCell> findPath(int nRow, int nCol) 
{ 

    aBoard[nRow][nCol].setVisited(true); 
    if(aBoard[nRow][nCol].getVal() == 'E') 
    { 
     Vector<GameCell> list = new Vector<GameCell>(); 
     list.add(aBoard[nRow][nCol]); 
     return list; 
    } 


    if(canGoLeft(nRow, nCol)) 
    { 
     if(!aBoard[nRow][nCol - 1].isVisited()) 
     { 

      return findPath(nRow, --nCol); 
     } 
    } 

    if(canGoRight(nRow, nCol)) 
    { 
     if(!aBoard[nRow][nCol+1].isVisited()) 
     { 
      return findPath(nRow, ++nCol); 
     } 

    } 

    if(canGoUp(nRow, nCol)) 
    { 
     if(!aBoard[nRow - 1][nCol].isVisited()) 
     { 
      return findPath(--nRow, nCol); 
     } 
    } 

    if(canGoDown(nRow, nCol)) 
    { 
     if(!aBoard[nRow + 1][nCol].isVisited()) 
     { 
      return findPath(++nRow, nCol); 
     } 
    } 

    System.out.println("You hit a dead end."); 
    return null; 

} 

Есть ли способ, которым я не могу создать экземпляр моего Вектора каждую рекурсии, так что я могу хранить свои ценности навсегда?

Любая помощь была бы принята с благодарностью.

+0

Да. Передайте его как аргумент методу и создайте его из метода. –

+0

Я должен уточнить, параметры, которые я установил, являются единственными, которые я могу использовать согласно моей спецификации. Мой вектор должен быть создан в этом методе. –

+1

'java.util.Vector' устарел 19 лет. Как долго вы программируете на Java? –

ответ

0

Я нашел решение, мне пришлось добавить элементы в свой список после того, как я нашел свой путь по пути обратно в стопку рекурсии. Вот решение. У меня все еще есть ошибка, но проблема, о которой я просил, исправлена.

protected Vector<GameCell> findPath(int nRow, int nCol) 
{ 
    this.aBoard[nRow][nCol].setVisited(true);   
    if(this.aBoard[nRow][nCol].getVal() == 'E') 
    { 
     Vector<GameCell> list = new Vector<GameCell>(); 
     list.add(this.aBoard[nRow][nCol]); 
     return list; 
    } 

    if(canGoUp(nRow, nCol)) 
    { 
     if(!this.aBoard[nRow - 1][nCol].isVisited()) 
     { 
      Vector<GameCell> list = findPath(nRow - 1, nCol); 
      if(list != null) 
      { 
       list.add(this.aBoard[nRow][nCol]); 
       return list; 
      } 
     } 
    } 

    if(canGoRight(nRow, nCol)) 
    { 
     if(!this.aBoard[nRow][nCol+1].isVisited()) 
     { 
      Vector<GameCell> list = findPath(nRow, nCol + 1); 
      if(list != null) 
      { 
       list.add(this.aBoard[nRow][nCol]); 
       return list; 
      } 
     } 

    } 

    if(canGoLeft(nRow, nCol)) 
    { 
     if(!this.aBoard[nRow][nCol - 1].isVisited()) 
     { 
      Vector<GameCell> list = findPath(nRow, nCol - 1); 
      if(list != null) 
      { 
       list.add(this.aBoard[nRow][nCol]); 
       return list; 

      } 
     } 
    } 

    if(canGoDown(nRow, nCol)) 
    { 
     if(!this.aBoard[nRow + 1][nCol].isVisited()) 
     { 
      Vector<GameCell> list = findPath(nRow + 1, nCol); 
      if(list != null) 
      { 
       list.add(this.aBoard[nRow][nCol]); 
       return list; 
      } 
     } 
    } 

    return null; 

} 
+0

Исправлена ​​последняя ошибка, и теперь все работает. Если у меня есть предварительные приращения и сокращения в моих вложенных операциях if, я должен был бы иметь + или - 1 вместо этого. Not -nRow, но nRow - 1. Возврат возвращался к ним после возврата null и возврата нулевого значения в 2 значения в моем списке вместо 1. –

1

Типичный способ сделать это заключается в передаче другому методу, который является рекурсивным и принимает список, чтобы заполнить в качестве аргумента:

public List<GameCell> findPath(int nRow, int nCol) { 
    List<GameCell> result = new ArrayList<>(); 
    doFindPathRecursively(result, nRow, nCol); 
    return result; 
} 

private void doFindPathRecursively(List<GameCell> result, int nRow, int nCol) { 
    ... 
} 

Заметим, что вектор эффективно устаревшим, так как Java 2, поэтому использование списка List и ArrayList.

+0

К сожалению, я не могу использовать внешние методы для этого; иначе это было бы намного проще. Я обновил свой вопрос, чтобы уточнить, что мне нужно. –

+1

Это похоже на произвольное, нереалистичное требование. Но вы также можете вернуть создание и вернуть список при каждом вызове и добавить возвращенный список к текущему, чтобы добиться такого же эффекта. –

+0

Кажется последовательным, что учитель, который все еще использует «Вектор», выдавал задания с произвольными и нереалистичными требованиями ... – slim