4clojure:集合交集,递归lambda
我试图编写一个递归lambda函数(接受两个参数),用于查找两个(可能)未排序集之间的交集。以下是代码,我相信大多数人会直接找到:4clojure:集合交集,递归lambda,clojure,Clojure,我试图编写一个递归lambda函数(接受两个参数),用于查找两个(可能)未排序集之间的交集。以下是代码,我相信大多数人会直接找到: (fn intersection [a b] (fn inner [x y out] (if (empty? x) out (if (nil? (some ((set (first x)) y ))) (inner (rest x) y out)))) (inner (rest x) y (cons (first x) out)) (
(fn intersection [a b]
(fn inner [x y out]
(if (empty? x) out
(if (nil? (some ((set (first x)) y )))
(inner (rest x) y out))))
(inner (rest x) y (cons (first x) out))
(inner a b '[])
)
我希望使用这个lambda函数交集来代替下面的下划线uu:
(=({01123}{23445}){233})
然而,这段代码未能编译,坚持认为Java在这个上下文中无法解析symbol:INTERNAR
有什么建议吗
来源:您可以尝试:
#(set (filter %1 %2))
因为集合是函数(参见另一个有用的示例)。%1
和%2
的语法与书写相同:
(fn [s1 s2] (set (filter s1 s2)))
或者更简洁地说:
(comp set filter)
关于内部
错误,您只是将参数放错了位置(但我真的看不出其他逻辑):
如果您坚持手动构建集合(我不久前没有这么做),您可能会得到类似的结果:
(fn [s1 s2]
(reduce #(if (contains? s2 %2) (conj %1 %2) %1) #{} s1))
但实际上第一个解决方案是最优雅的。如果错误描述有点简练,那就很抱歉了,但感觉好像我们一直在绕圈寻找解决这个问题的方法,已经有一段时间了:(交集接受两个参数并返回另一个集,对吗?那么为什么要返回一个函数?
(fn [s1 s2]
(reduce #(if (contains? s2 %2) (conj %1 %2) %1) #{} s1))