私が取り組んでいるプロジェクトでは、私が興味深い問題に遭遇しました。私は "The Little Schemer"を読んでいる途中ですので、いくつかの再帰手法を試しています。再帰を使ってこれを行う別の方法があるのか、再帰を使わない方法があるのならば興味があるのだろうかと思います。Clojure(または一般的なLisp)でseq - 再帰を分割する
問題は、シーケンスをとり、それをseqのseqに分割することです。例えば、このベクター:
配列を((:a :d :g) (:b :e :h) (:c :f :i))
とではn = 4を生成する、N = 3で分配
[ :a :b :c :d :e :f :g :h :i ]
:
((:a :e :i) (:b :f) (:c :g) (:d :h))
など。私は2つの機能を使ってこれを解決しました。最初のものは内側のseqsを作成し、もう一方は内側のseqsを作成します。ここに私の機能は以下のとおりです。
(defn subseq-by-nth
"Creates a subsequence of coll formed by starting with the kth element and selecting every nth element."
[coll k n]
(cond (empty? coll) nil
(< (count coll) n) (seq (list (first coll)))
:else (cons (nth coll k) (subseq-by-nth (drop (+ n k) coll) 0 n))))
(defn partition-by-nth
""
([coll n]
(partition-by-nth coll n n))
([coll n i]
(cond (empty? coll) nil
(= 0 i) nil
:else (cons (subseq-by-nth coll 0 n) (partition-by-nth (rest coll) n (dec i))))))
私は単純に再帰のために複数のアリティを持つパーティションごとのn番目の機能と完全に満足してないんだけど、別の方法を見ることができませんでした。
これはすべてのテストケースでうまくいくようです。まともなアプローチですか?それはあまりにも複雑ですか?再帰なしでこれを行う方法はありますか、または単一の再帰関数で行うことはできますか?
ありがとうございます。私はClojureとLispの両方に新しいので、私は別のテクニックを拾い上げています。
おかげで、それは素晴らしいです!私はそれが簡単かもしれないとは考えていませんでした。私がこれを理解し始めていると思うようになったとき、私は本当に少ししか示されていません。 –
私は感情を知っている! – JohnJ
@DaveKincaid:再帰を使用するのではなく、既存の高次関数を使用してソリューションをモデル化する必要があります。この種の簡潔なソリューションを考え出すことができます:) – Ankur