2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 101
|
|
1 | |
Для заданного n получить все возможные перестановки чисел 1,2,...n09.11.2014, 20:31. Показов 11566. Ответов 9
Метки нет Все метки)
(
Подскажите, как решается эта задача.
Для заданного n получить все возможные перестановки чисел 1,2..n.
0
|
|
09.11.2014, 20:31 | |
Ответы с готовыми решениями:
9
Все возможные перестановки элементов заданного массива
Дано n различных чисел, напечатать все возможные перестановки этих чисел |
09.11.2014, 20:40 | 2 |
Решается просто - n! Приходится к такому решению по-разному, можно так - для 1,2 у нас 2 перестановки, при добавлении к любой последовательности очередного элемента количество перестановок умножается на порядковый номер этого элемента - то есть, сколько он может занимать положений внутри исходного списка, умноженное на количество перестановок списка.
1
|
Вездепух
![]() ![]() 11182 / 6125 / 1677
Регистрация: 18.10.2014
Сообщений: 15,424
|
||||||
09.11.2014, 22:27 | 3 | |||||
![]() Решение
Эта задача является классикой программирования. Если на элементах последовательности задать строгий порядок (который естественен для набора различных целых чисел), то существует простой алгоритм, который генерирует все перестановки, одну за другой, в лексикографическом порядке.
http://en.wikipedia.org/wiki/P... phic_order 1. Начинаем с A = { 1, 2, ..., n } 2. Находим максимальное i, такое что A[i] < A[i + 1] 3. Находим максимальное j, j > i, такое что A[i] < A[j] 4. Обмениваем местами A[i] и A[j] 5. Зеркально перворачиваем подмассив в диапазоне [i+1, n] 6. Переходим на шаг 2 Алгоритм завершается, если на шаге 2 мы не можем найти такого i, т.е. когда все элементы расположились в убывающем порядке. Добавлено через 46 минут Вот, например, прямая реализация этого алгоритма в моем фирменном стиле ![]() Кликните здесь для просмотра всего текста
Добавлено через 1 минуту В задаче вроде требуется получить сами перестановки, а не посчитать их количество...
2
|
09.11.2014, 23:09 | 4 | |||||
![]() Решение
Действительно, это более вероятный вариант трактовки задания. Тогда я "в моем фирменном стиле" предложил бы рекурсия в 2 строчки.
Добавлено через 34 минуты
1
|
Вездепух
![]() ![]() 11182 / 6125 / 1677
Регистрация: 18.10.2014
Сообщений: 15,424
|
|
10.11.2014, 00:04 | 5 |
В данном случае рекурсия - не божественна. Божественен тот факт, что задача допускает эффективный способ разворота рекурсии в честный цикл, т.е. циклическое решение без сохранения "тяжелого" continuation state.
0
|
10.11.2014, 01:58 | 6 |
TheCalligrapher, если быть честным, хотя бы перед самим собой, то следует с вами согласиться. Почти всегда наличие альтернативного нерекурсивного алгоритма более божественно, чем рекурсия, и данный случай, похоже, не исключение. Хотя есть известная теорема насчет того, что любой рекурсивный алгоритм можно переписать через нерекурсивный, более того - есть явные схемы для этого: использование собственного стека вместо системного для сохранения контекста вызовов, но когда нерекурсивный алгоритм еще и хоть сколько-нибудь изящен - это только плюс. Но раз уж в этой теме вы реализовали божественный нерекурсивный алгоритм, то для симметрии и следования собственному стилю мне просто необходимо было продемонстрировать альтернативу из нескольких строчек рекурсии.
1
|
Модератор
![]() ![]() |
|
10.11.2014, 12:12 | 7 |
Можно предложить и другую идею (тоже рекурсивную).
1) Очевидно, что при n=2 результат = {(1,2),(2,1)} 2) При произвольном n ,берем набор перестановок от (n-1) и в каждую вставляем n на все места по очереди: (1,2) -> (3,1,2) (1,3,2) (1,2,3) (2,1) -> (3,2,1) (2,3,1) (2,1,3) и т.д. Конечно, лексикографический перебор эффективнее, но этот алгоритм, мне кажется, нагляднее.
1
|
10.11.2014, 14:24 | 8 |
Catstail, идей можно много разных предложить, но приходится учитывать возможности языка и стандартных библиотек. Ваше "берем - вставляем" отлично сработает на функциональных языках со списками, а на С с массивами вставлять элемент в массив ну очень неудобно. На другом языке я бы организовывал выборку из оставшегося списка элементов, а не снова полный перебор по всем n с пропуском тех, которые уже набраны, или быструю проверку на вхождение элемента в список одним оператором/функцией, а на С мне пришлось отдельный цикл городить. В общем, я хочу сказать, что ограничения языка могут сильно влиять на выбор конкретной реализации алгоритма.
0
|
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 101
|
||||||
07.12.2014, 11:04 [ТС] | 10 | |||||
_Ivana, TheCalligrapher, Catstail, объясните,пожалуйста,алгоритм работы этой программы
0
|
07.12.2014, 11:04 | |
07.12.2014, 11:04 | |
Помогаю со студенческими работами здесь
10
Дано n различных чисел, напечатать все возможные перестановки этих чисел
Ввести число. Используя рекурсивную функцию, получить все возможные перестановки цифр этого числа
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |