「縮小マップ」機能を実装しようとしています。つまり、f
の最初の 2 つの項目に適用した結果と、そのcoll
結果に適用f
した結果、および の 3 番目の項目coll
などで構成されるシーケンスを返す必要があります。
(def c [[0 0 0 0] [1 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 1]])
(defn- sum-vector [v1 v2]
(map + v1 v2))
(defn reduce-map [f coll & acc]
(if (< (count coll) 2)
(if (empty? acc) coll acc)
(let [head (apply f (take 2 coll))
tail (drop 2 coll)]
(recur f (conj tail head) (conj acc head)))))
たとえば、この関数を次のように呼び出します。
(reduce-map sum-vector c)
返す必要があります:
[[1 0 0 0] [1 1 0 0] [1 1 1 0] [1 1 1 1]]
(実際には、おそらく最初の項目も変更されずに返され、より適切に模倣されるはずmap
ですが、後で修正できます。)
さて、これはそれが返すものです:
((1 1 1 1) (1 1 1 0) (1 1 0 0) (1 0 0 0))
(ny) seq の最後に「プッシュ」するにはどうすればよいですか?
を代入reduce-map
するとrecur
、次のように返されます。
(((1 1 1 1) ((1 1 1 0) ((1 1 0 0) ((1 0 0 0))))))
recur
上記のコードの真の再帰との違いは何ですか?
そして、組み込みの、またはより優れた、またはより慣用的な実装方法はありますreduce-map
か?
最後に、出力シーケンスを遅延させたいと思います。全体を でラップするだけlazy-seq
ですか?