gpt4 book ai didi

clojure - 减少递归搜索的代码行数

转载 作者:行者123 更新时间:2023-12-04 04:45:34 26 4
gpt4 key购买 nike

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

“事件”是一个列表

最佳答案

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

(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 通常不是最紧凑的形式,它通常写成 mapdoseq
  • if/recur 通常可以替换为对 filter 的调用
  • 如果您似乎因为某些特定要求而确实需要写这样的东西,通常是 zippers会更优雅地解决问题。
  • 关于clojure - 减少递归搜索的代码行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18237695/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com