【问题标题】:Clojure - Vector of vectors relationship between itemsClojure - 项目之间的向量关系向量
【发布时间】:2016-04-22 15:33:53
【问题描述】:

我正在学习 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 中的第二列,那么也存在关系,但是是间接的。

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

a 的关系(规则 1):

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

a 的关系(规则 2):

[[b c][o p]]

之后我还需要计算,但我不知道如何使用 clojure 进行函数式编程风格。我一直在与 O.O.自 2008 年开始编程,这是我第一次学习函数式编程。

有什么想法吗?

提前致谢。

【问题讨论】:

  • 第二个关系应该是[[b c] [b i] [o p]]

标签: vector clojure functional-programming


【解决方案1】:

好的。第一个很简单:

(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)
()

【讨论】:

    猜你喜欢
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 2016-08-14
    • 1970-01-01
    • 2012-10-08
    相关资源
    最近更新 更多