Я предполагаю, что knapsack
должен быть в вашем примере кода permute
. Кроме того, есть важная часть отсутствует: там должен быть код, который получает весь процесс начался, что-то вроде
public static void printAllPermutations(int[] list) {
permute(list, 0);
}
Сути рекурсии является то, что можно решить проблему путем решения меньшего экземпляра (ов) те же задачи , и эти более мелкие решения решают даже меньшие экземпляры и т. д., пока вы не попадете в «базовый регистр». Пусть printAllPermutations
называется этот список:
[1, 2, 3, 4, 5]
Это вызывает permute(list,0)
. Логика в цикле использует swap
, чтобы получить каждый элемент в первый элемент, а затем поменять их обратно; результатом является то, что он будет работать с каждым из этих списков:
[1, 2, 3, 4, 5]
[2, 1, 3, 4, 5]
[3, 2, 1, 4, 5]
[4, 2, 3, 1, 5]
[5, 2, 3, 4, 1]
Рекурсивный вызов вызывает код, чтобы найти все перестановки последних четырех элементов. Таким образом, когда вы работаете с [1, 2, 3, 4, 5]
, метод permute
вычисляет все перестановки [2, 3, 4, 5]
(меньший экземпляр той же проблемы). Это означает, что для каждой перестановки [2, 3, 4, 5]
метод выводит эту перестановку с 1 фронтом. И аналогично для всех перестановок [1, 3, 4, 5]
, он выведет каждую перестановку с 2 спереди и так далее. Если вы можете доверять тому, что метод работает правильно для этих четырех элементов, вы можете увидеть, что он будет работать для пяти элементов. И если вы можете доверять тому, что он работает для трех элементов, то вы можете верить, что он будет работать для четырех элементов и так далее. И когда он переходит к нулевым элементам, делать нечего, потому что есть только одна перестановка. (На самом деле, когда он переходит к одному элементу, делать нечего, что означает, что первый if
мог бы быть if (index >= list.length-1)
.) Это «базовый случай». Поскольку существует только одна перестановка, и это не связано с изменением списка вообще, остается только распечатать его.
Вы уверены, что разместили код именно так, как нашли его? Это не рекурсивно. –
Где ваш метод ранца определен? – SMA
Предполагаю, что это будет 'перестановка' вместо' рюкзака'? – ajb