首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >项之间向量关系的向量向量

项之间向量关系的向量向量
EN

Stack Overflow用户
提问于 2016-04-22 15:33:53
回答 1查看 75关注 0票数 0

我正在学习Clojure和,我面临着另一个问题,那就是我被困住了,我不知道如何处理它。以下是问题所在:

我有一个矢量向量:

代码语言:javascript
复制
[[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条)的关系:

代码语言:javascript
复制
[[a b][a n][a o]]

A(第2条)的关系:

代码语言:javascript
复制
[[b c][o p]]

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

有什么想法吗?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-22 15:51:47

好的。第一个很简单:

代码语言:javascript
复制
(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的一级关系,并将它们连接起来:

代码语言:javascript
复制
(defn rel2 [x data] 
  (mapcat (fn [[_ k]] (rel1 k data)) 
          (rel1 x data)))

(rel2 'a data)
;; => ([b c] [b i] [o p])

额外的好处是:您可以构造一个函数来计算这类关系中的任意n个关系:

如果你已经有了rel1

代码语言:javascript
复制
(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)))

在回购中:

代码语言:javascript
复制
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)
()
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36797942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档