У меня возникли проблемы с попыткой добавить int[]
в List<int[]>
, но в рекурсивном методе. Я получаю все перестановки int[]
размера N
для использования с другой функцией. I хочу, чтобы добавить каждую из этих перестановок в ранее упомянутый список. Однако не кажется, что int [] (shortestPath) может быть добавлен для всех перестановок, и, честно говоря, у меня недостаточно опыта рекурсии, чтобы узнать, почему распечатки каждого массива работают, но добавление в список просто добавляет первый arr (тот, который прошел как параметр) 6 раз.Java Recursion со списком <int[]> .add() Repeat Values
Мой код выглядит следующим образом:
public int counter = 0;
public List<int[]> shortestPaths = new ArrayList<int[]>();
public void permute(int[] arr, int startIndex) {
int size = arr.length;
if (arr.length == (startIndex + 1)) {
System.out.print("Permutation " + counter + " is: ");
for (int i = 0; i < size; i++) {
if (i == (size - 1)) System.out.print(arr[i] + "\n\n");
else System.out.print(arr[i] + ", ");
}
shortestPaths.add(arr);
counter++;
} else {
for (int i = startIndex; i < size; i++) {
int[] copy = arr.clone();
int tmp = copy[i];
copy[i] = copy[startIndex];
copy[startIndex] = tmp;
permute(copy, startIndex + 1);
//tmp = arr[i];
//arr[i] = arr[startIndex];
//arr[startIndex] = tmp;
copy = null;
}
}
}
public static void main(String[] args) {
int[] arr = { 1, 2, 3 };
permute(arr, 0);
System.out.print("\n\n\n\n");
for (int[] a : s.shortestPaths) {
System.out.println(a[0] + ", " + a[1] + ", " + a[2] + "\n\n");
}
P.S. - Распечатки доступны только для быстрого просмотра состояния структур данных. Разумеется, они будут удалены, когда реализация будет полностью функциональной :) Кроме того, этот код вложен в класс, который имеет гораздо больше функций, связанных с обработкой матрицы. Эта функция, в частности, является вспомогательной функцией для алгоритма кратчайшего пути.
Заранее благодарим тех, кто знает рекурсию лучше, чем я, и которые готовы помочь!
Chris
Благодарим вас за предложение. Теперь я понимаю, почему копирование необходимо, и я внес изменения, чтобы отразить это в моем коде. Сейчас он работает на 50%. Если вы запустите метод, вы заметите, что вывод следующий: '1, 2, 3',' 1, 2, 3', '2, 1, 3',' 2, 1, 3', '3 , 2, 1', '3, 2, 1'. Это не совсем странно, и я уверен, что это связано с одним из операторов свопинга, но я не могу понять, почему он не заменяет набор в каждой паре дубликатов. Я смотрел на это некоторое время, хотя, возможно, это просто явная ошибка, которую я просматриваю ... –
@ChrisCirefice - Я добавил живой пример. Надеюсь, что это поможет. – vidit
Хорошо, я исправил это! Это была операция подкачки, вторая - конкретная. Я сделал копию «предыдущей перестановки» для int [] и менял местами значения скопированного массива, но я должен был обменивать «назад» значения оригинала (при замене «вперед» значения скопированного массива) ... смысл? В любом случае, я буду обновлять код после этого комментария, чтобы отразить изменения. Надеюсь, кто-то еще наткнется на эту проблему в будущем и найдет мой код и вашу идею копирования полезной! О, и я понимаю, что вы имели в виду под «нулевым» сейчас ... это также работает: P –