1

I want to create a sequence, however to create its every element I need access to the two previous elements. What is the generic way to do such things in clojure ?

So two slightly diff cases - a) seq is (a b c) when I am processing c I want to have access to a and b .... b) and having such ability to create the sequence itself by always being able to access th two previous elements.

Thanks, Murtaza

4

3 に答える 3

3

パーティションはこれをほぼ無料で提供します:

(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 が 3 の倍数でない場合、最後のセグメントの要素が 3 つ未満になる可能性があるという事実を関数に認識させる必要があります。余分なものを削除したい場合は、partition代わりに使用しますpartition-all

于 2012-06-20T02:53:17.037 に答える
2

さて、これがそれを行う一つの方法です。g最後の2つの値を入力として受け取り、次の値を生成する関数があるとします。

(defn f [g x0 x1] 
  (let [s (g x0 x1)] 
    [s (fn [] (f g x1 s))]))

gシーケンス内の2つの連続する値が与えられ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

iterate2 つの要素のベクトルを使用して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 に答える