Найти тему
programmer's notes (python and more)

Программирование на языке Python. Комбинаторные алгоритмы. Генерация перестановок

Доброго времени суток, читатели, зрители моего канала programmer's notes, любители языка Python. Не забывайте подписываться и писать свои
комментарии к моим статьям и видео.

Алгоритмы на Python | programmer's notes (python and more) | Дзен

Алгоритм генерации перестановок на языке Python

Начинаю целую серию статей о комбинаторных алгоритмах. Алгоритмы, конечно, жадные, но увлекательные. Мне скажут, что есть же библиотеки, зачем самим то. Но это же интересно. А по библиотекам будут ещё уроки, в частности по itertools.

Алгоритм генерации перестановок, в действительности, совсем не сложный, если вникнуть в смысл. Напомню, что количество перестановок считается по формуле n!.

Программа генерации перестановок массива см. ниже.

Текст программы см. ниже
Текст программы см. ниже
primer157.py

Несколько замечаний по программе.

  • Исходный массив для перестановок ll. Массив lss вспомогательный массив. Элементы его двухкомпонентные. Первая компонента это элемент массива, вторая флаг, который определяет, что данный элемент массива ll уже использован в генерации очередной перестановки.
  • В цикле ищется свободный элемент массива ll. Он присваивается очередному элементу массива lss. После этого вызывается рекурсивно функция perm(). Если параметр равен n, значит очередная перестановка сгенерирована. Если нет, то в цикле опять ищется свободный элемент массива ll. При этом пропускается элементы, используемые на предыдущих шагах рекурсии.

Ниже представлен вариант того же решения, но без использования в рекурсии глобальных переменных. Некоторые считают, что использование в рекурсивной функции глобальных переменных это дурной тон. Ну Бог им судья!

Текст программы см. ниже
Текст программы см. ниже
primer158.py

Кстати, в качестве тренировки. Дополните программу возможностью подсчёта количества перестановок. Конечно, мы знаем, что их n!, но попробуйте подсчитывать их непосредственно с учётом получения очередной перестановки.

Следующая статья по комбинаторике на Python...

Хорошего программирования. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.

Если генерировать все перестановки массива, то в конце концов он окажется упорядоченным. Не благодарите
Если генерировать все перестановки массива, то в конце концов он окажется упорядоченным. Не благодарите