2015-02-15 2 views
0

При попытке решить проблему с перестановкой с рекурсией я увидел это решение в Интернете, но я не уверен, как это создает все возможные перестановки массива.Не могли бы вы объяснить этот код мне явно для java?

Четкое, краткое объяснение было бы весьма признателен

public static void permute(int [] list, int index){ 
    if(index == list.length){ 
     System.out.println(Arrays.toString(list)); 
    } 
    else{ 
     for(int i = index; i < list.length; i++){ 
      swap(list, index, i); 
      knapsack(list, index + 1); 
      swap(list, index, i); 
     } 
    } 
} 
public static void swap (int [] a, int b, int c){ 
    int temp = a[b]; 
    a[b] = a[c]; 
    a[c] = temp; 
} 
+0

Вы уверены, что разместили код именно так, как нашли его? Это не рекурсивно. –

+0

Где ваш метод ранца определен? – SMA

+0

Предполагаю, что это будет 'перестановка' вместо' рюкзака'? – ajb

ответ

0

Я предполагаю, что 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).) Это «базовый случай». Поскольку существует только одна перестановка, и это не связано с изменением списка вообще, остается только распечатать его.

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