これは、シーケンス内包表記を使用する小さなソリューションです。読みやすいことを願っていますが、再帰のすべてのレベルでリストを再フィルタリングするため、パフォーマンスの賞を獲得することは間違いありません. 驚くほど効率的なリデュースベースのソリューションが可能だと思いますが、まだそれらを書くコツをつかんでいます-他の誰かが投稿してくれることを願っています:)。
注 - ツリーをどのように見せたいか正確にわからなかったため、各ノードのマップ全体を返しました...
(defn make-tree
([coll] (let [root (first (remove :parent coll))]
{:node root :children (make-tree root coll)}))
([root coll]
(for [x coll :when (= (:parent x) (:id root))]
{:node x :children (make-tree x coll)})))
(pprint (make-tree coll))
{:node {:id 1},
:children
({:node {:parent 1, :id 2},
:children
({:node {:parent 2, :id 4},
:children
({:node {:parent 4, :id 5},
:children
({:node {:parent 5, :id 6}, :children ()}
{:node {:parent 5, :id 7},
:children ({:node {:parent 7, :id 9}, :children ()})}
{:node {:parent 5, :id 8}, :children ()})})})}
{:node {:parent 1, :id 3}, :children ()})}