【发布时间】:2014-10-08 21:00:38
【问题描述】:
我在它们的clojure中有序列
(1 2 3 4)
我怎样才能得到像这样的序列的所有尾部
((1 2 3 4) (2 3 4) (3 4) (4) ())
【问题讨论】:
标签: clojure functional-programming clojurescript
我在它们的clojure中有序列
(1 2 3 4)
我怎样才能得到像这样的序列的所有尾部
((1 2 3 4) (2 3 4) (3 4) (4) ())
【问题讨论】:
标签: clojure functional-programming clojurescript
另一种获得所有尾巴的方法是使用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=>
【讨论】:
如果您想使用更高级别的函数来执行此操作,我认为iterate 在这里可以很好地工作:
(defn tails [xs]
(concat (take-while seq (iterate rest xs)) '(()))
但是,我认为在这种情况下,使用lazy-seq 编写它会更简洁:
(defn tails [xs]
(if-not (seq xs) '(())
(cons xs (lazy-seq (tails (rest xs))))))
【讨论】:
rest,它返回一个ChunkedSeq,它的打印方式与列表相同。
这是一种方法。
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) ())
【讨论】:
一种方法是通过
(defn tails [coll]
(take (inc (count coll)) (iterate rest coll)))
【讨论】:
(defn tails
[s]
(cons s (if-some [r (next s)]
(lazy-seq (tails r))
'(()))))
【讨论】:
耶!另一个:
(defn tails [coll]
(if-let [s (seq coll)]
(cons coll (lazy-seq (tails (rest coll))))
'(())))
这正是reductions 在幕后所做的。顺便说一句,最好的答案是ez121sl's。
【讨论】: