1

我想创建一个序列,但是要创建它的每个元素,我需要访问前两个元素。在 clojure 中做这些事情的一般方法是什么?

所以两个略有不同的情况 - a) seq 是 (abc) 当我处理 c 我想访问 a 和 b .... b) 并具有通过始终能够访问这两个来创建序列本身的能力以前的元素。

谢谢,穆尔塔萨

4

3 回答 3

3

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

于 2012-06-20T02:53:17.037 回答
2

好吧,这是一种方法。假设您有一个函数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)
于 2012-06-20T02:36:41.247 回答
1

您可以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)
于 2012-06-20T02:32:11.533 回答