Код выглядит правильно, хотя у вас есть только ядро алгоритма, а не полная программа.Вам нужно будет указать отсутствующие биты: заголовки, функцию main
и макрос swap
(можно сделать функцию swap
, назвав ее swap(s, d, i)
).
Чтобы понятьВ алгоритме было бы полезно добавить некоторые результаты трассировки, скажем printf("permute(%s, %d)", s, d)
в начале функции permute
, и запустить программу с 3- или 4-символьной строкой.
Основной принципявляется то, что каждый рекурсивный вызов permute
последовательно размещает каждый оставшийся элемент в позиции d
;элемент, который находился в позиции d
, сохраняется, помещая его туда, где оставался вышеупомянутый оставшийся элемент (то есть элементы меняются местами).Для каждого размещения permute
вызывается рекурсивно для генерации всех желаемых подстрок после позиции d
.Поэтому вызов верхнего уровня (d
= 0) в permute
последовательно пробует все элементы в позиции 0, вызовы второго уровня (d
= 1) пробуют все элементы в позиции 1, за исключением того, который уже находится в позиции0 и т. Д. У ближайших к глубокому вызову (d
= n
-1) есть один элемент, который нужно попробовать в последней позиции, а самые глубокие вызовы (d
= n
) выводят итоговую перестановку.
Основной алгоритм требует времени выполнения Θ (n · n!), Которое является наилучшим из возможных, так как это размер выходных данных.Однако эта реализация менее эффективна, чем могла бы быть, потому что она пересчитывает strlen(s)
на каждой итерации, для времени выполнения Θ (n² · n!);простое исправление предварительного вычисления длины даст yield (n · n!).Реализация требует Θ (n) памяти, которая является наилучшей из возможных, так как это размер ввода.