Clojure 减少递归搜索的代码行数
减少我用Lisp/Clojure编写的代码行已经成为我的一个困扰。我试图缩短以下代码(本质上是深度优先搜索)Clojure 减少递归搜索的代码行数,clojure,Clojure,减少我用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))) no
(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])
“活动”是一个列表这可能是作弊,尽管它只有一行;) 关于问题原意的几点意见:
- loop/recer通常不是最紧凑的形式,它通常使用
或map
doseq
- if/recur通常可以替换为调用
filter
- 如果由于某些特定的需求,您似乎真的需要编写这样的内容,那么通常会更优雅地解决问题李>
(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})