2

减少我用 Lisp/Clojure 编写的代码行数已成为我的痴迷。我正在尝试使以下代码(本质上是深度优先搜索)更短。

(defn find-node  [nodeid in-node]
  (if (= nodeid (:id in-node))
    in-node
    (loop [node nil activities (:activities in-node)]
      (if (or (empty? activities) (not (nil? node)))
        node
        (recur (find-node nodeid (first activities)) (rest activities))))))

(defn find-node-in-graph [nodeid node activities]
  (if (empty? activities)
    node
    (recur nodeid (find-node nodeid (first activities)) (rest activities))))

(defrecord Graph [id name activities])
(defrecord Node [id name activities])

“活动”是一个列表

4

1 回答 1

3

这可能是作弊,尽管它只有一行;)

(def tree {:id 1 :children [{:id 2 :children [{:id 3}]} {:id 4}]})

core> (filter #(= 3 (:id %)) (tree-seq :children :children tree)) 
({:id 3}) 

core> (filter #(= 2 (:id %)) (tree-seq :children :children tree))
({:children [{:id 3}], :id 2})

关于问题初衷的几点:

  • loop/recer 通常不是最紧凑的形式,它通常用mapor编写doseq
  • if/recur 通常可以替换为调用filter
  • 如果你似乎真的因为一些特定的需求而需要写这样的东西,通常zippers会更优雅地解决问题。
于 2013-08-15T00:13:12.263 回答