2015-11-17 13 views

risposta

9

Ti piace questa:

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

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

Questo non è il codice Elixir molto idiomatica. –

+5

@OnorioCatenacci Questo non è un commento molto informativo. : D Non sono ancora un esperto di elisir. Sarei felice di vedere una soluzione più idiomatica se avete tempo di postarne una - per lo più la metto qui perché pensavo che sarebbe stata una domanda comune ma non ho trovato una risposta su SO. La prossima volta che cercherò, lo farò. Lo considero una "nota per sé" che gli altri possono anche usare. –

+1

Il commento non è stato davvero diretto a voi. Era più diretto verso gli altri che potevano vedere il tuo codice e, non sapendo niente di meglio, assumere che fosse il modo giusto per scrivere il codice Elixir. –

5

C'è un approccio leggermente diverso, supporta anche specificando la lunghezza desiderata per le liste di risultati:

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 

In esecuzione:

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

Problemi correlati