Итак, давайте проанализируем пример {A, B, C}
.
Во-первых, вы хотите извлечь из него один элемент и получить остальное.Таким образом, вы должны были бы написать какую-то функцию, которая будет возвращать список пар:
pairs = [ (A, {B, C})
(B, {A, C})
(C, {A, B}) ]
для каждой из этих пар, вы получите отдельный список перестановок, которые могут быть сделаны из него, как это:
for pair in pairs do
head <- pair.fst // e.g. for the first pair it will be A
tails <- perms(pair.snd) // e.g. tails will be a list of permutations computed from {B, C}
Вам необходимо прикрепить head
к каждому хвосту от tails
, чтобы получить полную перестановку. Таким образом, полный цикл будет:
permutations <- []
for pair in pairs do
head <- pair.fst // e.g. for the first pair it will be A
tails <- perms(pair.snd) // e.g. tails will be a list of permutations computed from {B, C}
for tail in tails do
permutations.add(head :: tail); // here we create a complete permutation
head :: tail
означает, что мы придаем один элемент head
к началу списка tail
.
Ну, как реализовать perms
Функция, используемая во фрагменте tails <- perm(pair.snd)
. Мы просто сделали! Вот что такое рекурсия. :)
Нам еще нужен базовый случай, так:
perms({X}) = [ {X} ] // return a list of one possible permutation
и функция для всех остальных случаев выглядит следующим образом:
perms({X...}) =
permutations <- []
pairs <- createPairs({X...})
for pair in pairs do
head <- pair.fst // e.g. for the first pair it will be A
tails <- perms(pair.snd) // e.g. tails will be a list of permutations computed from {B, C}
for tail in tails do
permutations.add(head :: tail); // here we create a complete permutation
return permutations
Этот вопрос сделал мой день. Но серьезно, это вполне разумно, я с нетерпением жду, когда кто-то с действительно исключительными навыками обучения ответит. :) – siledh