gpt4 book ai didi

clojure - clojure 中的笛卡尔积

转载 作者:行者123 更新时间:2023-12-04 00:01:08 24 4
gpt4 key购买 nike

我正在尝试实现一种方法,该方法将获取列表列表并返回这些列表的笛卡尔积。

这是我到目前为止所拥有的:

(defn cart


([] '())
([l1] (map list l1))
([l1 l2]
(map
(fn f[x] (map
(fn g [y] (list x y))
l2))
l1)
)

)

(defn cartesian-product [& lists]
(reduce cart lists)

)





;test cases
(println (cartesian-product '(a b) '(c d))) ; ((a c) (a d) (b c) (b d))
(println (cartesian-product ())) ;()
(println (cartesian-product '(0 1))) ; ((0) (1))
(println (cartesian-product '(0 1) '(0 1))) ; ((0 0) (0 1) (1 0) (1 1))
(println (apply cartesian-product (take 4 (repeat (range 2))))) ;((0 0 0 0) (0 0 0 1) (0 0 1 0) (0 0 1 1) (0 1 0 0) (0 1 0 1) (0 1 1 0) (0 1 1 1) (1 0 0 0) (1 0 0 1) (1 0 1 0) (1 0 1 1) (1 1 0 0) (1 1 0 1) (1 1 1 0) (1 1 1 1))

问题是我的解决方案真的很“括号”。
(((a c) (a d)) ((b c) (b d)))
()
(0 1)
(((0 0) (0 1)) ((1 0) (1 1)))
(((((((0 0) (0 1)) 0) (((0 0) (0 1)) 1)) 0) (((((0 0) (0 1)) 0) (((0 0) (0 1)) 1)) 1)) ((((((1 0) (1 1)) 0) (((1 0) (1 1)) 1)) 0) (((((1 0) (1 1)) 0) (((1 0) (1 1)) 1)) 1)))

我尝试添加
      (apply concat(reduce cart lists))

但后来我遇到了这样的崩溃:
((a c) (a d) (b c) (b d))
()
IllegalArgumentException Don't know how to create ISeq from: java.lang.Long clojure.lang.RT.seqFrom (RT.java:494)

所以,我想我很接近但缺少一些东西。但是,由于我对 clojure 和函数式编程还很陌生,所以我可能走在完全错误的轨道上。请帮忙! :)

最佳答案

我会检查 https://github.com/clojure/math.combinatorics它有

(组合/笛卡尔积 [1 2] [3 4])
;;=> ((1 3) (1 4) (2 3) (2 4))

关于clojure - clojure 中的笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18246549/

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