DFS나 BFS나 concat 순서 하나 차이임. 더군다나 테일리커전이라 스택도 안쓰고.


한줄요약: 남자는 재귀



;;;;;


(defrecord Node [name children])


(def A (->Node "A" []))

(def B (->Node "B" [A]))

(def C (->Node "C" []))

(def D (->Node "D" [B C]))


(defn tree-search [node name dfs-or-bfs]

  (let [search-fn (cond (= dfs-or-bfs :dfs)

                        (fn [nodes children] (concat children nodes))


                        (= dfs-or-bfs :bfs)

                        (fn [nodes children] (concat nodes children))


                        :else (Exception. (str "Unknown search method " dfs-or-bfs)))]

    (letfn [(fn-for-node [node nodes]

              (if (= (:name node) name)

                node

                #(fn-for-nodes (search-fn nodes (:children node)))))

            (fn-for-nodes [[node & more-nodes]]

              (if (empty? node)

                nil

                #(fn-for-node node more-nodes)))]

      (trampoline fn-for-node node []))))



(tree-search D "A" :bfs)


(tree-search D "A" :dfs)