#javascript #arrays #sorting #recursion #permutation
#язык JavaScript #массивы #сортировка #рекурсия #перестановка
Вопрос:
Учитывая набор чисел, верните все возможные перестановки. Выведите перестановки чисел в новой строке через пробел, также убедитесь, что перестановки напечатаны в отсортированном порядке, то есть «1 2 3» должно стоять перед «2 3 1». Пример:
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
Я решил эту проблему с помощью рекурсии, и все работает нормально, за исключением последних двух выходных данных… 3 2 1
идет до 3 1 2
, и я перепробовал все, но не могу понять, как это сделать. Раньше я думал, что это можно сделать с помощью встроенного метода localeCompare (), но я не смог его использовать, кроме того, в этом много проблем (сначала преобразовать массив в строку, затем использовать этот метод, а затем снова преобразовать обратно в массив). Код приведен ниже. Пожалуйста, помогите мне. Заранее спасибо.
function genPermut(arr, curr) { if (curr === arr.length) { console.log(arr); return; } for (let i = curr; i lt; arr.length; i ) { swap(arr, i, curr); genPermut(arr, curr 1); swap(arr, i, curr); } } function swap(arr, x, y) { let temp = arr[x]; arr[x] = arr[y]; arr[y] = temp; return (arr[x], arr[y]); } genPermut([1, 2, 3], 0);
Комментарии:
1. Пожалуйста, покажите нам код, чтобы мы могли вам помочь.
2. @WaisKamal, пожалуйста, взгляните сейчас
3. это домашнее задание?
4. Именно это и делает этот алгоритм. На последней итерации вызова функции верхнего уровня первый своп поменяет первое значение на последнее значение в массиве, что приведет к [3, 2, 1], а затем все остальное просто следует из этого. Вам понадобится другой алгоритм.
5. Кроме того, вы должны учитывать, что происходит, когда входной массив изначально не отсортирован, и вам придется иметь дело с повторяющимися значениями в этом массиве (если не указано, что они будут уникальными): замена двух одинаковых значений приведет к выводу одной и той же перестановки, что вам не нужно.