Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 减少递归搜索的代码行数_Clojure - Fatal编程技术网

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

减少我用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])


“活动”是一个列表

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

关于问题原意的几点意见:

  • loop/recer通常不是最紧凑的形式,它通常使用
    map
    doseq
  • if/recur通常可以替换为调用
    filter
  • 如果由于某些特定的需求,您似乎真的需要编写这样的内容,那么通常会更优雅地解决问题
使用tree-seq是否会违背问题的关键?一些示例输入和输出将有助于定制答案。我正在制作一个树格式来提供答案。我不确定我是否会把这篇文章写得太长和垃圾。是的,tree-seq是替换这些函数的宏。tree-seq正是我所需要的。我知道像唱片这样基本的东西会有一些整洁的东西。先生,你刚刚参加了银河十字军,以减少代码行数。赞美你。换句话说,tree seq正是我想要的。
(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})