Псевдо код рекурсивного метода печати Все перестановки $ n $ ждет целых чисел
-
28-09-2020 - |
Вопрос
Я действительно не понимаю этот псевдо код.Функция печатает все перестановки $ n $ equies, предполагая, что все номера различны.
Есть ли способ более легко объяснить этот код, так как я действительно не получаю цель обмена.
PERMUTATE(A, start, end)
if start == end return A
else
PERMUTATE(A,start+1,end)
for i = start+1 to end
SWAP(A[i],A[start])
PERMUTATE(A,start+1,end)
SWAP(A[start],A[i])
. Решение
Ваша процедура производит все перестановки ввода, возвращая ее в исходное состояние в конце.
Когда вход имеет длину 1, нечего делать.
В противном случае предположим, что вход - $ a_1, \ ldots, a_n $ . Представим все перестановки $ a_1, \ ldots, a_n $ как $ [A_1, \ ldots, a_n] $ < / span>.
Вот то, что делает процедуру:
- .
- Выход $ a_1, [a_2, a_3, \ ldots, a_ {n-1}, a_n] $ .
- Выход $ a_2, [a_1, a_3, \ ldots, a_ {n-1}, a_n] $ .
- Выход $ A_3, [a_2, a_1, \ ldots, a_ {n - 1}, a_n] $ .
- ...
- Выход $ a_n, [a_2, a_3, \ ldots, a_ {n-1}, a_1] $ .
На первом шаге процедура только что переходит все перестановки хвоста списка, состоящего из всех, кроме первого элемента.
На втором шаге он переключается $ a_1 $ и $ a_2 $ , проходит через все перестановки хвоста, а затем переключаются $ a_1 $ и $ a_2 $ Назад.
на третьем шаге, он переключается $ a_1 $ и $ a_3 $ , проходит все перестановки хвоста, а затем переключается $ a_1 $ и $ a_3 $ Назад.
и так далее, пока в $ n $ th Step, он переключается $ a_1 $ и $ a_n $ , переходит все перестановки хвоста, а затем переключается $ a_1 $ и <класс SPAN= «Математический контейнер»> $ a_n $ назад.