2024年Clojure状态调查!中分享你的想法。

欢迎!请查看关于页面,了解更多关于这一功能的信息。

0
Clojure

我有一个任务要编写一个函数,该函数给出列表的幂集。

列表(1 2 3)的输出应该是这样的

1
2
3
1 2
1 3
2 3
1 2 3
我尝试了以下辅助函数

(defn print-powerset-helper [lst] (if(not(empty? lst)) (do (println(first lst)) (print-lst (rest lst)))))
这给了我

1
2
3
nil
这样的输出。

我还尝试了以下函数

(defn print-powerset [lst] (if (not (empty? lst)) (do (apply println lst (print-lst lst)))))
输出

1
2
3
(1 2 3)
nil
我想去掉括号,并且也不懂怎么打印输出的中间部分。1 2 1 3 2 3,这部分。

请任何帮助都将很好。谢谢!

2 答案

+1

幂集是集合论中一个数学问题和解决方案。
如果你理解了这个问题和解决方案,你就可以在任何语言中写出解决方案。

参见:https://en.wikipedia.org/wiki/Power_set

对于这类问题的解决方案,我通常搜索Java库,99%的情况下,已经存在一些你可以直接使用的东西,而且已经过充分的调试和优化。

https://guava.dev/releases/20.0/api/docs/com/google/common/collect/Sets.html#powerSet-java.util.Set-

如果你想查看另一个Java解决方案,可以查看
https://www.geeksforgeeks.org/finding-all-subsets-of-a-given-set-in-java/

对于纯Clojure解决方案,请看
你可以使用:https://github.com/clojure/math.combinatorics/

 (require '[clojure.math.combinatorics :as combo])
 (combo/subsets [1 2 3])
 >> (() (1) (2) (3) (1 2) (1 3) (2 3) (1 2 3))

组合数学中的Clojure解决方案更接近维基百科中Python解决方案,并使用组合来生成子集。

https://github.com/clojure/math.combinatorics/blob/master/src/main/clojure/clojure/math/combinatorics.cljc#L218

Java解决方案通过利用不同组合可以用二进制数表示这一事实进行了优化。

要打印值,可以使用字符串join和一个doseq。












0
太好了。第二个答案中的实现让我目瞪口呆: https://gist.github.com/anonymous/796299
...