Генерация вариаций с повторениями Эрланга - PullRequest
0 голосов
/ 21 октября 2018

Я нашел способ генерировать комбинации списка, но здесь порядок не имеет значения, но мне нужно генерировать варианты, где порядок имеет значение.

Комбинация:

comb_rep(0,_) ->
    [[]];
comb_rep(_,[]) ->
    [];
comb_rep(N,[H|T]=S) ->
    [[H|L] || L <- comb_rep(N-1,S)]++comb_rep(N,T).

Вывод этого:

comb_rep(2,[1,2,3]).
[[1,1],[1,2],[1,3],[2,2],[2,3],[3,3]]

Желаемый вывод:

comb_rep(2,[1,2,3]).
[[1,1],[1,2],[1,3],[2,2],[2,3],[3,1],[3,2],[3,3]]

1 Ответ

0 голосов
/ 22 октября 2018

Следуя объяснению в комментариях, это будет мой первоначальный подход:

cr(0, _) ->
    [];
cr(1, L) ->
    [ [H] || H <- L ];
cr(N, L) ->
    [ [H | T] || H <- L, T <- cr(N - 1, L -- [H]) ].

Перестановки длины 0 - это крайний случай.Я бы даже подумал об удалении этого предложения, чтобы функция вызывала сбой, если вызывается как таковая.

Перестановки длины 1 означают просто каждый элемент в своем собственном списке .

* 1009.* Тогда для рекурсивного случая, если у вас уже есть перестановки списка без текущего элемента (cr(N - 1, L -- [H])), вы можете просто добавить этот элемент в начало каждого списка, и вам просто нужно сделатьчто для каждого элемента в исходном списке (H <- L).

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...