Cartesian product of two or more lists: Difference between revisions

Content added Content deleted
Line 532: Line 532:
{(1, 3), (1, 4), (2, 3), (2, 4)}
{(1, 3), (1, 4), (2, 3), (2, 4)}
{(1, 30, 500), (1, 30, 100), (2, 30, 500), (2, 30, 100), (3, 30, 500), (3, 30, 100)}
{(1, 30, 500), (1, 30, 100), (2, 30, 500), (2, 30, 100), (3, 30, 500), (3, 30, 100)}
</pre>

=={{header|Clojure}}==
<lang Clojure>
(ns clojure.examples.product
(:gen-class)
(:require [clojure.pprint :as pp]))

(defn cart [colls]
"Compute the cartesian product of sets represented as lists of lists"
(if (empty? colls)
'(())
(for [more (cart (rest colls))
x (first colls)]
(cons x more))))
</lang>
'''Output'''
<lang clojure>
(doseq [lst [ [[1,2],[3,4]],
[[3,4],[1,2]], [[], [1, 2]],
[[1, 2], []],
[[1776, 1789], [7, 12], [4, 14, 23], [0, 1]],
[[1, 2, 3], [30,], [500, 100]],
[[1, 2, 3], [], [500, 100]]
]
]
(println lst '=>')
(pp/pprint (cart lst)))
</lang>

<pre>
[[1 2] [3 4]] =>'
((1 3) (2 3) (1 4) (2 4))
[[3 4] [1 2]] =>'
((3 1) (4 1) (3 2) (4 2))
[[] [1 2]] =>'
()
[[1 2] []] =>'
()
[[1776 1789] [7 12] [4 14 23] [0 1]] =>'
((1776 7 4 0)
(1789 7 4 0)
(1776 12 4 0)
(1789 12 4 0)
(1776 7 14 0)
(1789 7 14 0)
(1776 12 14 0)
(1789 12 14 0)
(1776 7 23 0)
(1789 7 23 0)
(1776 12 23 0)
(1789 12 23 0)
(1776 7 4 1)
(1789 7 4 1)
(1776 12 4 1)
(1789 12 4 1)
(1776 7 14 1)
(1789 7 14 1)
(1776 12 14 1)
(1789 12 14 1)
(1776 7 23 1)
(1789 7 23 1)
(1776 12 23 1)
(1789 12 23 1))
[[1 2 3] [30] [500 100]] =>'
((1 30 500) (2 30 500) (3 30 500) (1 30 100) (2 30 100) (3 30 100))
[[1 2 3] [] [500 100]] =>'
()
</pre>
</pre>