我有一个Clojure的序列。
(1 2 3 4)
如何获取序列的所有尾部,例如:
((1 2 3 4) (2 3 4) (3 4) (4) ())
我有一个Clojure的序列。
(1 2 3 4)
((1 2 3 4) (2 3 4) (3 4) (4) ())
使用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))))))
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。
iterate
函数首先返回第二个参数本身,而没有应用函数。然后它开始应用rest
函数,该函数返回一个ChunkedSeq
,其打印方式与列表相同。 - soulcheck