【发布时间】:2016-08-14 23:51:48
【问题描述】:
我刚开始学习 Clojure 和函数式编程,但在尝试实现以下任务时遇到了困难:
我有一个这样的向量向量 [[a b] [a c] [b c] [c d] [d b]]。我需要遍历它,删除已经出现在第二列的第二列中的项目。例如项目 [b c] 和 [d b](因为 c 和 b 都已出现在第二列)。我设法获得了一个当时删除一个项目的函数,但我需要遍历每个项目检查和删除项目的向量。我怎样才能做到这一点?我考虑过使用递归来实现这一点,但每次尝试都以失败告终
例如
输入: [[a b] [a c] [b c] [c d] [a d] [b e]]
输出(预期): [[a b] [a c] [c d] [b e]]
删除的项目: [[b c] [a d]]
如您所见,c 和 d 已经分别出现在前面的项目 [a c] 和 [c d] 上,所以我必须删除项目 [b c] 和 [a d]。
到目前为止,我有以下代码
此函数返回要删除的项目的向量。在我们的场景中,它返回向量 [[b c] [a d]]
(defn find-invalid [collection-data item-to-check]
(subvec (vec (filter #(= (second %) item-to-check) collection-data)) 1))
(defn find-invalid [collection-data item-to-check]
(subvec (vec (filter #(= (second %) item-to-check) collection-data)) 1))
这个其他函数一次从原始向量中删除一个项目,按项目的给定索引
(defn remove-invalid [collection-data item-position]
(vec (concat (subvec collection-data 0 item-position) (subvec collection-data (inc item-position)))))
最后一个函数是我用来测试这个逻辑的
(defn remove-invalid [original-collection ]
(dorun (for [item original-collection]
[
(dorun (for [invalid-item (find-invalid original-collection (second item))]
[
(cond (> (count invalid-item) 0)
(println (remove-invalid original-collection (.indexOf original-collection invalid-item)))
)
]))
])))
我认为递归可以解决我的问题,但如果能帮我解决这个问题,我将不胜感激:)。
提前致谢。
【问题讨论】:
-
好问题。我相信 clojure 专业人士会来救援 =]
标签: recursion vector clojure functional-programming