This works fine as well. More to digest. Thanks.

On 19 Aug, 20:06, Benny Tsai <benny.t...@gmail.com> wrote:
> This is one way to do it functionally, though it's a bit more verbose.
>
> "get-nodes" performs a BFS walk of the tree between two nodes, returning the
> set of visited nodes:
>
> (defn get-nodes [from to]
>   (loop [queue [from]
>          visited #{}]
>     (let [[x & xs] queue]
>       (if-not x
>         visited
>         (recur (concat xs (candidates x to))
>                (conj visited x))))))
>
> With that in hand, "build-tree" can build the adjacency list by simply
> calling "candidates" on each node on the walk, ignoring nodes with no
> children:
>
> (defn build-tree [from to]
>   (into {} (for [n (get-nodes from to)]
>              (when-let [children (seq (candidates n to))]
>                [n children]))))
>
> user=> (build-tree :a :e)
> {:a (:b), :c (:e), :b (:c :d), :d (:e)}

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to