Clojure - 项目之间向量关系的向量



我正在学习Clojure和函数式编程,我面临着另一个问题,我被困住了,我不知道如何处理它。问题是这样的:

我有一个向量向量:

[[a b][b c][c d][d e][e f][f g][f h][b i][d j][j l][l m][a n][a o][o p]]

我需要在一些项目之间建立关系。关系规则如下:

1 - 与第一列具有相同值的每个项目都有直接关系。

2 - 如果有任何项目的第一列等于规则 1 中的第二列,则也存在关系,但存在间接关系。

在我们的场景中,关系将是:

论坛的关系(规则 1):

[[a b][a n][a o]]

论坛的关系(规则 2):

[[b c][o p]]

之后我还需要计算,但我无法弄清楚如何使用 clojure 进行函数式编程风格。自2008年以来,我一直在O.O.编程工作,这是我第一次学习函数式编程。

有什么想法吗?

提前谢谢。

好的,第一个很简单:

(def data '[[a b][b c][c d][d e][e f][f g][f h]
            [b i][d j][j l][l m][a n][a o][o p]])
(defn rel1 [x data] (filter #(= (first %) x) data))
(rel1 'a data)
;; => ([a b] [a n] [a o])

您只需保留所有对,其第一项是您需要的

第二个稍微复杂一些。您必须为所有第一级关系找到第一级关系。例如:当a的第一级关系[[a b][a n][a o]]时,你必须找到bno的第一级关系,并将它们连接起来:

(defn rel2 [x data] 
  (mapcat (fn [[_ k]] (rel1 k data)) 
          (rel1 x data)))
(rel2 'a data)
;; => ([b c] [b i] [o p])

作为奖励:您可以编造一个函数来计算此类的任何第 n 个关系:

如果您已经有rel1

(defn rel1 [x data] (filter #(= (first %) x) data))
(defn rel-n [x data n]
  (when (pos? n)
    (nth (iterate #(mapcat (fn [[_ k]] (rel1 k data)) %)
                  [[nil x]])
         n)))

在回复中:

user> (rel-n 'a data 0)
nil
user> (rel-n 'a data 1)
([a b] [a n] [a o])
user> (rel-n 'a data 2)
([b c] [b i] [o p])
user> (rel-n 'a data 3)
([c d])
user> (rel-n 'a data 4)
([d e] [d j])
user> (rel-n 'a data 5)
([e f] [j l])
user> (rel-n 'a data 6)
([f g] [f h] [l m])
user> (rel-n 'a data 7)
()

最新更新