我想创建一个序列,但是要创建它的每个元素,我需要访问前两个元素。在 clojure 中做这些事情的一般方法是什么?
所以两个略有不同的情况 - a) seq 是 (abc) 当我处理 c 我想访问 a 和 b .... b) 并具有通过始终能够访问这两个来创建序列本身的能力以前的元素。
谢谢,穆尔塔萨
我想创建一个序列,但是要创建它的每个元素,我需要访问前两个元素。在 clojure 中做这些事情的一般方法是什么?
所以两个略有不同的情况 - a) seq 是 (abc) 当我处理 c 我想访问 a 和 b .... b) 并具有通过始终能够访问这两个来创建序列本身的能力以前的元素。
谢谢,穆尔塔萨
partition 几乎免费为您提供:
(partition-all 3 1 (range 100))
((0 1 2) (1 2 3) (2 3 4) (3 4 5) (4 5 6) (5 6 7) (6 7 8) ... )
然后你可以将你的函数映射到分区序列上:
(map my-func (partition-all 3 1 (range 100)))
您只需要让您的函数意识到如果您的 seq 不是三的倍数,最后一段可能包含少于三个元素的事实。如果你想放弃任何额外的使用partition
而不是partition-all
好吧,这是一种方法。假设您有一个函数g
,它将最后两个值作为输入并产生下一个值。
(defn f [g x0 x1]
(let [s (g x0 x1)]
[s (fn [] (f g x1 s))]))
给定g
序列中的两个连续值,f
返回由下一个值和一个将返回该值的函数组成的对。您可以使用f
如下方式生成此类对的无限序列:
(iterate (fn [[v h]] (h)) (f g x0 x1))
要仅提取序列值,请执行以下操作:
(map first (iterate (fn [[v h]] (h)) (f g x0 x1)))
例如:
user=> (take 10 (map first (iterate (fn [[v h]] (h)) (f + 0 1))))
(1 2 3 5 8 13 21 34 55 89)
您可以iterate
使用两个元素的向量,然后获取first
结果序列的。
例如,要创建斐波那契数列:
user=> (def fib (map first (iterate (fn [[a b]] [b (+ a b)]) [1 1])))
#'user/fib
user=> (take 10 fib)
(1 1 2 3 5 8 13 21 34 55)