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> |
||