2015-11-17 5 views

ответ

9

Как это:

defmodule Permutations do 
    def of([]) do 
    [[]] 
    end 

    def of(list) do 
    for h <- list, t <- of(list -- [h]), do: [h | t] 
    end 
end 
+1

Это не очень идиоматических код Elixir. –

+5

@OnorioCatenacci Это не очень информативный комментарий. : D Я еще не эксперт по эликсиру. Я был бы рад увидеть более идиоматическое решение, если у вас будет время опубликовать его - в основном я положил это здесь, потому что думал, что это будет общий вопрос, но я не нашел ответа на SO. В следующий раз, когда я буду искать, я это сделаю. Я считаю это «записью для себя», которую могут использовать и другие. –

+1

Комментарий на самом деле не был направлен на вас. Это было больше направлено на других, которые могли бы видеть ваш код и, не зная ничего лучше, предполагают, что это правильный способ написать код Эликсира. –

5

Там в несколько иной подход, он также поддерживает задав необходимую длину для списков результата:

defmodule Permutations do 
    def shuffle(list), do: shuffle(list, length(list)) 

    def shuffle([], _), do: [[]] 
    def shuffle(_, 0), do: [[]] 
    def shuffle(list, i) do 
    for x <- list, y <- shuffle(list, i-1), do: [x|y] 
    end 
end 

iex(24)> Permutations.shuffle ["a", "b", "c"] 
[["a", "a", "a"], ["a", "a", "b"], ["a", "a", "c"], ["a", "b", "a"], 
["a", "b", "b"], ["a", "b", "c"], ["a", "c", "a"], ["a", "c", "b"], 
["a", "c", "c"], ["b", "a", "a"], ["b", "a", "b"], ["b", "a", "c"], 
["b", "b", "a"], ["b", "b", "b"], ["b", "b", "c"], ["b", "c", "a"], 
["b", "c", "b"], ["b", "c", "c"], ["c", "a", "a"], ["c", "a", "b"], 
["c", "a", "c"], ["c", "b", "a"], ["c", "b", "b"], ["c", "b", "c"], 
["c", "c", "a"], ["c", "c", "b"], ["c", "c", "c"]] 

iex(25)> Permutations.shuffle ["a", "b", "c"], 2 
[["a", "a"], ["a", "b"], ["a", "c"], ["b", "a"], ["b", "b"], ["b", "c"], 
["c", "a"], ["c", "b"], ["c", "c"]] 

Source