gpt4 book ai didi

clojure - 需要一个与 disj 类似的函数,但用于 clojure 中的列表。总体来说可以吗?

转载 作者:行者123 更新时间:2023-12-01 22:27:47 25 4
gpt4 key购买 nike

我需要遍历一个列表并对每个元素和不包括该元素的元素进行一些计算。例如,有一个列表 (1 2 3 1),我需要对 (1) (2 3 1), (2) (1 3 1) (3) (1 2 1)(1) (2 3 1)

最佳答案

(...) with every element and the elements excluding that element.

每个元素听起来都像一个 map 排除该元素听起来像一个过滤器。让我们从后者开始。

user=> (filter #(not= % 1) '(1 2 3))
(2 3)
太棒了。现在让我们尝试将其映射到所有元素。

user=> (let [coll '(1 2 3)] (map (fn [elem] (filter #(not= % elem) coll)) coll))
((2 3) (1 3) (1 2))

创建实际的配对留给读者作为练习。提示:修改map中使用的闭包。

请记住,上面建议的解决方案对于短列表应该可以正常工作,但其复杂度为 O(n²)。另一个问题是无法正确处理具有重复项的集合。

让我们采用递归方法。我们将基于 looprecur 进行递归。

(defn pairs [coll]
(loop [ahead coll behind [] answer []]
(if (empty? ahead)
answer
(let [[current & remaining] ahead]
(recur remaining
(conj behind current)
(conj answer [(list current)
(concat behind remaining)]))))))

一个简单的例子:

user=> (pairs '(1 2 3))
[[(1) (2 3)] [(2) (1 3)] [(3) (1 2)]]

具有重复项的向量:

user=> (pairs [1 5 6 5])
[[(1) (5 6 5)] [(5) (1 6 5)] [(6) (1 5 5)] [(5) (1 5 6)]]

关于clojure - 需要一个与 disj 类似的函数,但用于 clojure 中的列表。总体来说可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13605768/

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