请在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
空值
这个输出。

我还试了这个函数

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

1
2
3
(1 2 3)
空值
我希望去除括号,并且不理解如何打印输出中间的部分。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解决方案通过利用不同组合可以用二进制数表示这一事实进行了相当优化的处理。

要打印值,可以使用字符串连接和doseq。

  (require '[clojure.math.combinatorics :as combo])
  (require '[clojure.string :as s])

  (doseq [l (combo/subsets [1 2 3])]
      (println (s/join ",", l)))


  如果您想删除空集,请使用 filter。

  (doseq [l (filter (complement empty?)  
                                                                             (combo/subsets [1 2 3]))]
       (println (s/join ",", l)))
0
不错。第二个答案中的实现让我印象深刻:https://gist.github.com/anonymous/796299
...