我正在学习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]]A(第2条)的关系:
[[b c][o p]]在此之后,我还需要计算,但我不知道如何使用clojure实现函数式编程风格。自2008年以来,我一直在使用O.O.编程,这是我第一次学习函数式编程。
有什么想法吗?
提前谢谢。
发布于 2016-04-22 15:51:47
好的。第一个很简单:
(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)
()https://stackoverflow.com/questions/36797942
复制相似问题