使用以下深度优先搜索的递归定义,Clojure (JVM) 和 ClojureScript(使用连接到浏览器的repl和lumo进行测试)REPL会产生两种不同的输出,即节点打印顺序不同,而Clojure REPL会产生重复的
:f
。ClojureScript的顺序是我期望的行为。这是为什么呢?(defn dfs
([g v] (dfs g v #{}))
([g v seen]
(println v)
(let [seen (conj seen v)]
(for [n (v g)]
(if-not (contains? seen n)
(dfs g n seen))))))
(def graph {:a [:b :c :e]
:b [:d :f]
:c [:g]})
(dfs graph :a)
Cloure REPL 输出:
:a
:b
:c
:e
:d
:f
:g
:f
;; => ((() ()) (()) (()))
CLojureScript REPL 输出:
:a
:b
:d
:f
:c
:g
:e
;; => ((() ()) (()) ())
:f
,而且我的括号与你的cljs括号相同。 - Josh