gpt4 book ai didi

recursion - Clojure - 从循环内的向量中删除项目

转载 作者:行者123 更新时间:2023-12-02 23:23:24 25 4
gpt4 key购买 nike

我刚刚开始学习 Clojure 和函数式编程,在尝试实现以下任务时遇到了困难:

我有一个像这样的向量向量[[a b] [a c] [b c] [c d] [d b]]。我需要迭代它,删除第二列中已经出现的项目。例如项目 [b c] 和 [db] (因为 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)))
)
]))
])))

我认为递归可以解决我的问题,但我将不胜感激任何帮助来完成这个任务:)。

提前致谢。

最佳答案

实现此目的的一种方法是使用 reduce :

(first (reduce (fn [[result previous] [a b]]
[(if (contains? previous b)
result
(conj result [a b]))
(conj previous b)])
[[] #{}]
'[[a b] [a c] [b c] [c d] [d b]]))
;=> [[a b] [a c] [c d]]

我们希望跟踪迄今为止建立的结果 (结果) 以及我们之前在第二列中找到的项目集 (上一个) >)。然后,对于每个新项目 [a b],我们检查 previous 是否包含第二个项目 b。如果是,我们不会向结果添加任何内容。否则,我们将新项[a b]conjresult的末尾。我们还conj第二项bprevious中。由于 previous 是一个集合,因此如果 previous 已包含 b,则不会执行任何操作。最后,在reduce完成后,我们从结果中取出first项,它代表我们的最终答案。

关于recursion - Clojure - 从循环内的向量中删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36775353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com