Псевдо код рекурсивного метода печати Все перестановки $ n $ ждет целых чисел

cs.stackexchange https://cs.stackexchange.com/questions/119432

Вопрос

Я действительно не понимаю этот псевдо код.Функция печатает все перестановки $ 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 $ назад.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с cs.stackexchange
scroll top