作業中2015 AoC clojureを学ぶ上での問題...以下は40回目の反復では十分に速いですが、それ以降はほとんど停止します。私はいくつかの他の人々のソリューションと比較して、なぜこれがなぜとても遅いのかはすぐわかりません。私はそれがループほど効率的であると信じて再帰を使用しようとしました(スタック消費を避けるため)。私が100%明確にしていないことの1つは、反復を使用しているか、ループ反復を使用しているかの違いがあるかどうかです。私は両方の方法でそれをテストし、違いは見られませんでした。clojure "look-and say"シーケンス
(def data "3113322113")
(defn encode-string [data results count]
(let [prev (first data)
curr (second data)]
(cond (empty? data) results
(not= prev curr)
(recur (rest data) (str results count prev) 1)
:else (recur (rest data) results (inc count)))))
(count
(nth (iterate #(encode-string % "" 1) data) 40 #_50))
本当にいいです、私はあるブルースHaumanさんをベンチマークソリューションの例:私は繰り返し、非常に大きな文字列を反復処理しています私の溶液中で実現
(defn count-encode [x]
(apply str
(mapcat
(juxt count first)
(partition-by identity x))))
が、私はしません彼が明示的に反復しているわけではありませんが、パーティションはたぶんシーンの裏で反復しているので、Bruceの方がはるかに高速です。