2013-09-22 4 views
0

Я работаю над своим назначением Lab для моего класса CS, Мне нужно заполнить метод, предоставленный мне инструктором, . Я добрался до точки, где я могу перейти к точке в массиве и отметьте направление перемещения, но оно работает только для некоторых позиций даже , хотя я вижу ясный путь.Поиск пути рекурсивно, переполнение?

, например, если я введу 8,2 Она находит путь просто отлично

Вот фото:

enter image description here

, но если я вхожу в точку 8,3, которая четко проходимый я получаю Переполнение и моя программа просто прыгает назад и вперед между строками 24 и 35

Если у кого-то есть идеи, где я ошибаюсь, я был бы признателен за некоторые советы! Спасибо Всем

public char[][] findPath(int startRow, int startCol, int destRow, int destCol, int threshold){ 

    if((startRow==destRow)&&(startCol==destCol)){ 
     JOptionPane.showMessageDialog(null, "A path has been found!"); 
     map[destRow][destCol] = '^'; 

     return map; 

     } 

    else if(startRow < 9 && checkIfPassable(startRow + 1, startCol, threshold)){ 
     map[startRow][startCol]= 'S'; 
     startRow++; 
     return findPath(startRow, startCol, destRow, destCol, threshold); 

     } 
    else if(startCol < 9 && checkIfPassable(startRow , startCol + 1, threshold)){ 
     map[startRow][startCol]= 'E'; 
     startCol++; 
     return findPath(startRow, startCol, destRow, destCol, threshold); 
    } 
    else if(startRow > 1 && checkIfPassable(startRow -1, startCol, threshold)){ 
     map[startRow][startCol]= 'S'; 
     startRow--; 
     return findPath(startRow, startCol, destRow, destCol, threshold); 

     } 
    else if(startCol > 1 && checkIfPassable(startRow , startCol -1, threshold)){ 
     map[startRow][startCol]= 'E'; 
     startCol--; 
     return findPath(startRow, startCol, destRow, destCol, threshold); 
    } 



    System.exit(1); 
    return map; 

} 
+1

Настоятельно рекомендую вам научиться использовать отладчик. –

ответ

0

Подсказка: вы должны попытаться отлаживать это сами:

  • Запуск программы с приложенным отладчиком. (Поскольку вы используете Eclipse, это очень легко сделать Ditto для другой Иды В противном случае, обратитесь к документации Oracle по jdb -..) http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/jdb.html

  • Установите контрольную точку, чтобы остановить программу в соответствующем месте.

  • Одиночный шаг программы, когда он рекурсирует, исследуя состояние локальных переменных и соответствующие ячейки map.

  • Определите, как он ведет себя по-другому, чем вы ожидаете.

  • Измените свой алгоритм.


Теперь мы могли бы попытаться понять наше что происходит не так для вас, но вы не показали нам достаточно кода. И что еще более важно, вам нужно научиться делать это самостоятельно!

+0

Спасибо. Я получил немного больше. Я добавил проверки, чтобы узнать, было ли я уже определенным местом. В настоящее время программа находит большинство мест –

0

Ваш алгоритм поиска должен быть более систематическим. Поскольку это написано, вы просто будете ходить по кругу, пока не переполните стек. Вам нужно убедиться, что вы не возвращаетесь обратно по тем местам, которые вы уже посетили.

На стилистическую ноте, если вы собираетесь с рекурсивной реализацией, вы должны сделать все методы параметры final и просто использовать +1 или -1, где вы сделаете рекурсивные вызовы, а не с помощью ++ или -- до рекурсивных вызовов, так что это ясно, просто по вкусу при рекурсивных вызовах, по которым идет рекурсия. Кроме того, открытие диалоговых окон или уничтожение приложения внутри вычисления, как правило, плохое. Используйте System.out.println или библиотеку регистрации, если вам нужна обратная связь о том, что делает ваш код.

Смежные вопросы