Cartesian product of two or more lists: Difference between revisions
Content added Content deleted
(Adding a new method based on recursion) |
Not a robot (talk | contribs) (Add APL) |
||
Line 46: | Line 46: | ||
[] |
[] |
||
[] |
[] |
||
</pre> |
|||
=={{header|APL}}== |
|||
APL has a built-in outer product operator: <code>X ∘.F Y</code> will get you an ⍴X-by-⍴Y |
|||
matrix containing every corresponding value of <code>x F y</code> for all x∊X, y∊Y. |
|||
The Cartesian product can therefore be expressed as <code>∘.,</code>, but as that would return |
|||
a matrix, and the task is asking for a list, you also need to ravel the result. |
|||
<lang APL>cart ← ,∘.,</lang> |
|||
{{out}} |
|||
<pre> 1 2 cart 3 4 |
|||
1 3 1 4 2 3 2 4 |
|||
3 4 cart 1 2 |
|||
3 1 3 2 4 1 4 2 |
|||
1 2 cart ⍬ ⍝ empty output |
|||
⍬ cart 1 2 ⍝ empty output again |
|||
</pre> |
|||
This can be reduced over a list of lists to generate the Cartesian product of an arbitrary |
|||
list of lists. |
|||
<lang APL>nary_cart ← ⊃(,∘.,)/</lang> |
|||
{{out}} |
|||
The items are listed on separate lines (using ↑) for clarity. |
|||
<pre style="height: 50ex"> |
|||
↑nary_cart (1776 1789)(7 12)(4 14 23)(0 1) |
|||
1776 7 4 0 |
|||
1776 7 4 1 |
|||
1776 7 14 0 |
|||
1776 7 14 1 |
|||
1776 7 23 0 |
|||
1776 7 23 1 |
|||
1776 12 4 0 |
|||
1776 12 4 1 |
|||
1776 12 14 0 |
|||
1776 12 14 1 |
|||
1776 12 23 0 |
|||
1776 12 23 1 |
|||
1789 7 4 0 |
|||
1789 7 4 1 |
|||
1789 7 14 0 |
|||
1789 7 14 1 |
|||
1789 7 23 0 |
|||
1789 7 23 1 |
|||
1789 12 4 0 |
|||
1789 12 4 1 |
|||
1789 12 14 0 |
|||
1789 12 14 1 |
|||
1789 12 23 0 |
|||
1789 12 23 1 |
|||
↑nary_cart(1 2 3)(,30)(50 100) |
|||
1 30 50 |
|||
1 30 100 |
|||
2 30 50 |
|||
2 30 100 |
|||
3 30 50 |
|||
3 30 100 |
|||
↑nary_cart(1 2 3)(⍬)(50 100) ⍝ empty output |
|||
</pre> |
</pre> |
||