Мне нужно написать программу, которая дает все перестановки числа. Например, пользователь вводит номер 4. Мне нужно вернуть все возможные комбинации чисел 1,2,3,4. У меня проблема с хорошим методом для получения всех перестановок. У меня это так, поэтому моя программа помещает число 1-n в массив. Тем не менее, я не могу придумать хороший способ получить перестановку. Я знаю, что мне нужно использовать рекурсию, но моя проблема - это способ получить перестановки в первую очередь. Я знаю, что переключение числа вокруг - это, пожалуй, лучший способ, но каков наилучший способ для этого?Алгоритм поиска всех перестановок числа
ответ
Самый простой способ понять алгоритм - это. Для того, чтобы получить все перестановки 1 до 4, вы хотите
- 1, а затем перестановки 2,3,4
- 2, а затем перестановки 1,3,4
- 3, с последующими перестановками 1,2,4
- 4, а затем перестановками 1,2,3
это довольно стандартный бит рекурсии. Для каждого числа рекурсивно найдите все перестановки других чисел и добавьте это число в начале.
Как это работает для больших чисел, например, 6 или 7? Разве у меня еще не возникло бы вопроса об обнаружении всех перестановок чисел до этого? –
@ColinNull Он работает одинаково - рекурсия заботится о поиске всех перестановок других чисел. – irrelephant
@ColinNull: замечание состоит в том, что в каждом из перечисленных выше четырех случаев список элементов, которые вы все еще должны переставлять *, меньше * - всего 3 элемента вместо оригинала 4. Итак, как сгенерировать каждый из их? Просто назовите свою собственную функцию «все-перестановки» с каждым из этих меньших наборов, надеясь, что она даст правильный ответ! Единственный случай, который вам действительно нужно решить «трудный путь», - это тот, где набор перестановок имеет длину 1 - и тогда ответ прост :) –
Мы можем просто использовать recursion
, чтобы получить возможности путем рекурсивного выбора одного элемента, а затем применения рекурсии к подмножеству этого массива. это пример для чисел от 1 до 3
Почему вы предоставляете код, когда TO конкретно запрашивает только алгоритм? – Landei
Я понимаю, почему это работает очень хорошо для 3, однако, как это будет работать для большего числа, например 6 или 7? Я еще не изучил рекурсию, поэтому извиняюсь, если мой вопрос кажется глупым. –
Чтобы лучше понять начало рекурсии с помощью простого примера, например, найти факториал числа n – Burusothman
Рекурсия является вашим другом. Если у вас есть один элемент, ваше решение очевидно [[1]]. Для двух элементов вы можете взять все свои «одни» -решения (ну, есть только одно) и придерживать 2 до или после 1, так что вы получите [[2,1], [1,2]]. Для трех элементов возьмите все ваши «два» решения и поместите их в первую, вторую или третью позицию. Из [2,1] вы получаете [3,2,1], [2,3,1] и [2,1,3]. Из [1,2] вы получаете [3,1,2], [1,3,2] и [1,2,3]. Все вместе, ваше решение - [[3,2,1], [2,3,1], [2,1,3], [3,1,2], [1,3,2], [1, 2,3]].
Обратите внимание, как chiastic-security's algorithm для генерации всех перестановок n чисел зависит от возможности генерации всех перестановок n-1 чисел? Чтобы использовать его алгоритм, все, что нам нужно, это способность и еще одна вещь: способ генерации всех перестановок набора, содержащего только одно число.
Создание всех перестановок одного числа тривиально: есть только один, состоящий только из этого числа.
Как насчет другого требования - возможность генерации всех перестановок чисел n-1? Это кажется сложнее, но этого оказалось не так. Предположим, что n = 2 для задачи, которую мы хотим решить: тогда n-1 = 1, и тогда мы в порядке, потому что знаем, как сгенерировать все перестановки из 1 числа. Таким образом, применение алгоритма хиастической безопасности дает нам способ генерации всех перестановок из 2 чисел. Если вместо n = 3 для задачи мы хотим решить, тогда n-1 = 2, и мы только что установили, что можем сгенерировать все перестановки из 2 чисел, поэтому мы все еще в порядке - мы знаем, как сгенерировать все перестановки 3-х чисел. Если вместо n = 4, то n-3 = 3, и мы только что установили, что можем сгенерировать все перестановки из 3 чисел, поэтому мы можем также сгенерировать все перестановки из 4 чисел. Ясно, что это рассуждение может продолжаться вечно - так что вы можете генерировать все перестановки любого числа чисел таким образом.
Это рассуждение является неофициальным, но его можно сделать полностью точным с помощью mathematical induction.Если индукция может быть применена, то удивительным результатом является то, что нам никогда не приходится решать любые «большие» проблемы «трудным путем» - мы всегда можем разбить их на одну или несколько мелких проблем, которые, в свою очередь, могут быть разбиты меньших проблем, до тех пор, пока не будет достигнут один или несколько «базовых случаев», которые легко решить, а затем решения более крупных проблем могут быть собраны вместе из этих решений в более простые подзадачи.
Да, его рассуждения были хорошими, и я понимаю, что это делает его менее сложным, делая n меньше. Однако для числа, такого как 8, для которого мне нужно было бы всего 7 перестановок для использования его логики, это все равно требует поиска 5040 перестановок и добавления правильных чисел в начало каждого из них. Я не знаю, просто ли я слишком усложняю это, но я не могу придумать способ получить каждую возможную перестановку. Я не могу найти конкретный шаблон для переключения чисел, который позволяет использовать каждую комбинацию. –
@ColinNull: предположим, что ваша функция называется 'perm()'. Когда вызывается 'perm ({1,2,3,4,5,6,7,8})' и ему нужно сгенерировать все 5040 перестановок 7-элементного набора '{2, 3, 4, 5, 6, 7, 8} ', как это можно сделать? Вызов 'perm ({2, 3, 4, 5, 6, 7, 8})'. Просто как тот! –
@ColinNull: Это * есть * рекурсия: вызов «самостоятельно» для решения небольших подзадач. –
- 1. Алгоритм поиска всех перестановок для n алфавитов
- 2. Алгоритм перестановок
- 3. Алгоритм перебора случайных перестановок
- 4. Алгоритм генерации всех перестановок пар без повторения
- 5. Список всех возможных перестановок факторов числа
- 6. Алгоритм ранжирования перестановок
- 7. Алгоритм перестановок без повторения?
- 8. Алгоритм для поиска числа комбинаций
- 9. Алгоритм перестановок без рекурсии? Java
- 10. Алгоритм для генерации всех уникальных перестановок целых разделов фиксированной длины?
- 11. Алгоритм вычисления перестановок
- 12. Алгоритм для поиска ВСЕ-факторизации целого числа
- 13. Алгоритм для поиска перестановок строк, где каждая позиция меняется
- 14. Алгоритм перечисления всех перестановок чисел {1,2, ..., n} с использованием стека
- 15. Алгоритм для печати всех перестановок строки без дубликатов
- 16. Алгоритм для создания всех перестановок строки без смежных символов
- 17. Эффективный алгоритм PHP для генерации всех комбинаций/перестановок входов
- 18. Алгоритм для генерации всех перестановок разных размеров группы целых чисел?
- 19. Алгоритм для всех перестановок строки в C++ или Python
- 20. Алгоритм для печати всех перестановок с повторением чисел
- 21. Поиск всех перестановок, которые соответствуют набору правил
- 22. Список всех перестановок
- 23. алгоритм перестановок массив здание php
- 24. Написание кода для перечисления всех возможных перестановок заданного числа элементов
- 25. Как найти gcd всех перестановок большого числа порядка 10^250?
- 26. Нахождение всех перестановок числа без дубликатов (отредактированный для ясности)
- 27. Алгоритм поиска всех возможных комбинаций клавиш в заданном диапазоне
- 28. Алгоритм для поиска квадратного корня числа?
- 29. Алгоритм для поиска следующего числа в последовательности
- 30. Использование recursion для поиска всех перестановок списка в Python
Возможно, вы захотите прочитать статью Sedgewick: http://homepage.math.uiowa.edu/~goodman/22m150.dir/2007/Permutation%20Generation%20Methods.pdf – NoChance
Перестановки выполняются на наборах объектов, а не на одиночные числа. – stackoverflowuser2010
Если это не так, как просить ** рекомендовать или найти книгу, инструмент, библиотеку программного обеспечения, учебник или другой ресурс вне сайта **, то я, сэр, являюсь голландец. –