Давно не писал о рекурсии. Одна из моих любимых тем. Сегодня задача прямо предназначенная для рекурсивного программирования. Генерация перестановок. Когда-то я решал какую-то задачу и написал этот алгоритм. Конечно он не оригинален, в литературе вы встретите разные его вариации. Мне он нравится, потому что, как мне кажется, он наиболее понятен и не требует дополнительных математических знаний.
Программа, реализующая указанный выше алгоритм представлена в main40.c. Смысл алгоритма заключается в том, что по очереди выбираются элементы массива, которые должны быть первыми в наборе, затем рекурсивно выбирается следующий элемент и т.д. Сами числа хранятся в массиве, состоящем из структур. В каждой структуре хранится само число и флаг, показывающий, что данное число уже использовалось в перестановке или не использовалось. Флаг возводится при каждом рекурсивном вызове (rec1) и сбрасывается при возврате из вызова. В программе есть недостаток, она не учитывает, что введенные для перестановки числа могут совпадать. Ну, надеюсь, вы сами подумаете над этой проблемой. |