ho sequenza in clojure di TheemCome ottenere le code di sequenza clojure
(1 2 3 4)
come posso ottenere tutte le code di sequenza come
((1 2 3 4) (2 3 4) (3 4) (4)())
ho sequenza in clojure di TheemCome ottenere le code di sequenza clojure
(1 2 3 4)
come posso ottenere tutte le code di sequenza come
((1 2 3 4) (2 3 4) (3 4) (4)())
Un altro modo per ottenere tutte le code è quello di utilizzare la funzione reductions
.
user=> (def x '(1 2 3 4))
#'user/x
user=> (reductions (fn [s _] (rest s)) x x)
((1 2 3 4) (2 3 4) (3 4) (4)())
user=>
Ecco un modo.
user=> (def x [1 2 3 4])
#'user/x
user=> (map #(drop % x) (range (inc (count x))))
((1 2 3 4) (2 3 4) (3 4) (4)())
Se si vuole fare questo con le funzioni di più alto livello, penso iterate
avrebbe funzionato bene qui:
(defn tails [xs]
(concat (take-while seq (iterate rest xs)) '(()))
Tuttavia, credo che in questo caso sarebbe più pulito per solo scrivere con lazy-seq
:
(defn tails [xs]
(if-not (seq xs) '(())
(cons xs (lazy-seq (tails (rest xs))))))
Grazie a ciò risulta ([1 2 3 4] (2 3 4) (3 4) (4)()) perché il primo uno è in forma vettoriale? – hariszaman
@hariszaman è perché iterate restituisce prima il secondo argomento stesso senza applicare la funzione. Quindi inizia ad applicare 'rest' che restituisce un' ChunkedSeq' che stampa allo stesso modo della lista. – soulcheck
Un modo per farlo è
(defn tails [coll]
(take (inc (count coll)) (iterate rest coll)))
questo forzerà qualsiasi input pigro – noisesmith
Sì, a causa del conteggio. Non ci ho pensato davvero. – turingcomplete
Yippee! Un altro:
(defn tails [coll]
(if-let [s (seq coll)]
(cons coll (lazy-seq (tails (rest coll))))
'(())))
questo è davvero solo quello reductions
fa sotto il cofano. La migliore risposta, a proposito, è ez121sl's.
questo non dovrebbe essere usato su sequenze pigre, la chiamata a contare forza l'intera sequenza – noisesmith