我有一个函数可以找到图中节点之间的最小距离,用 Ruby 编写。我把它翻译成 Clojure,但在我看来它看起来很糟糕。
数据的表示如下所示:
hash = {:v0 [:v1 :v2 :v3]
:v1 [:v4 :v5 :v6]
:v2 [:v7 :v8 :v9]
:v3 [:v10 :v11 :v12]
:v4 [:v13 :v14 :v15]}
Ruby 函数如下所示:
def distance src, target, hash
return 0 if src == target
return nil if hash[src].nil?
dist = 1
if hash[src].include? target
return dist
else
arr = hash[src].map {|x| distance x, target, hash}
end
arr = arr.delete_if {|x| x.nil?}
return dist + arr.min if !arr.empty?
return nil
end
Clojure 函数如下所示:
(use 'clojure.contrib.seq-utils)
(defn distance [src target h]
(if (= src target)
0
(if (nil? (h src))
nil
(if (includes? (h src) target)
1
(let [arr (filter #(not= % nil) (map #(distance % target h) (h src)))]
(if (= (empty? arr) true)
nil
(+ 1 (apply min arr))))))))
你能告诉我一种更优雅、更类似于 Clojure 的方式吗?那些嵌套的 if 很糟糕。