2014-09-27 15 views

risposta

12

Il modo più semplice sta usando math.combinatorics:

user> (require '[clojure.math.combinatorics :as combo]) 
nil 
user> (combo/permutations #{"word1" "word2" "word3"}) 
(("word1" "word2" "word3") ("word1" "word3" "word2") ("word2" "word1" "word3") ("word2" "word3" "word1") ("word3" "word1" "word2") ("word3" "word2" "word1")) 

Modifica: non ho esaminato l'implementazione di math.combinatorics, ma questa è una versione lenta perché OP ha richiesto un codice da seguire.

(defn permutations [s] 
    (lazy-seq 
    (if (seq (rest s)) 
    (apply concat (for [x s] 
        (map #(cons x %) (permutations (remove #{x} s))))) 
    [s]))) 
+0

sto ottenendo "iseq da: experiment.core $ eval261 $ fn__262" quando si tenta l'implementazione di permutazione. Chiamandolo come (println (permutazioni # ("w" "d" "m"))). È perché non riesco a stampare una sequenza pigra? – slimbo

+1

'# (" w "" d "" m ")' è la sintassi per una funzione anonima. Vuoi '# {" w "" d "" m "}' @stevemacn –

+0

ughh! Questo è l'errore che continuo a fare - grazie @diego – slimbo

6

Anche se math.combinatorics è probabilmente la risposta giusta, cercavo qualcosa di più semplice da seguire. Qui di seguito è un'implementazione non pigro che riesco a seguire:

(defn permutations [colls] 
    (if (= 1 (count colls)) 
    (list colls) 
    (for [head colls 
      tail (permutations (disj (set colls) head))] 
     (cons head tail)))) 
+0

Vedere il mio aggiornamento per una versione lenta. –

Problemi correlati