我正在学习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]]
时,你必须找到b
、n
和o
的第一级关系,并将它们连接起来:
(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)
()