В Mathematica это изначально реализовано как Tuples
.
Tuples[{{a, b, c}, {d, e, f}, {g, h, i}}]
{{a, d, g}, {a, d, h}, {a, d, i}, {a, e, g}, {a, e, h}, {a, e, i},
{a, f, g}, {a, f, h}, {a, f, i}, {b, d, g}, {b, d, h}, {b, d, i},
{b, e, g}, {b, e, h}, {b, e, i}, {b, f, g}, {b, f, h}, {b, f, i},
{c, d, g}, {c, d, h}, {c, d, i}, {c, e, g}, {c, e, h}, {c, e, i},
{c, f, g}, {c, f, h}, {c, f, i}}
Это также можно сделать с помощью Outer
(обобщенное внешнее произведение):
Outer[List, {a, b, c}, {d, e, f}, {g, h, i}]
Или с итерацией (Table
):
Table[{x, y, z},
{x, {a, b, c}},
{y, {d, e, f}},
{z, {g, h, i}}
]
Или с рекурсией:
sets[{}, c__] := {{c}}
sets[{x_, r___}, c___] := Join @@ (sets[{r}, c, #] & /@ x)
sets[{{a, b, c}, {d, e, f}, {g, h, i}}]