我有一些地圖你會如何調用優化這個構建樹的Clojure函數?
(def m1 [{:a 1, :b 2, :c 0}
{:a 1, :b 3, :c 0}
{:a 1, :b 0, :c 2}
{:a 1, :b 3, :c 1}
{:a 1, :b 0, :c 3}])
,我可以遞歸組與該功能
(defn group [ks coll]
(if (empty? ks) coll
(let [gs (group-by #(select-keys % [(first ks)]) coll)]
(map (fn [[k v]] {k (group (rest ks) v)}) (dissoc gs {})))))
,以產生預期的結果:
(group [:a :b :c] m1)
=>
({{:a 1} ({{:b 2} ({{:c 0} [{:a 1, :b 2, :c 0}]})}
{{:b 3} ({{:c 0} [{:a 1, :b 3, :c 0}]}
{{:c 1} [{:a 1, :b 3, :c 1}]})}
{{:b 0} ({{:c 2} [{:a 1, :b 0, :c 2}]}
{{:c 3} [{:a 1, :b 0, :c 3}]})})})
你怎麼能改寫這樣,在最後一個位置具有map
的功能,因爲它需要遵循多條路徑,是尾調用使用recur
優化的?
爲什麼你想要它是尾遞歸?現在情況很好。無論如何,懶惰通常比尾遞歸更好。 – amalloy
嗨 - 我只是對如何使用堆棧來維護和傳遞樹中所有狀態的實用性感興趣,特別是與分組鍵的附加狀態有關。即使在調整樹中的節點數和級別數時,上述函數仍可正常工作。 – judep
也有興趣如何用recur重置地圖。無法看到如何去做 – judep