http://www.perlmonks.org?node_id=250930

in reply to Creating tuples based on sets

Update: I missed the part about needing arbitrarily sized tuples. This only groups in sets of two...my bad. :(

Original message follows...

Ah, the joys of dot products. No need for recursion:

```#!/usr/bin/perl -w

@set = qw(A B C);

print join("\n", map(join(',', @\$_), @{&make_tuples(\@set, \@set)}));

sub make_tuples {
my(\$set1, \$set2) = @_;
my @product;
foreach my \$x (0 .. \$#\$set1) {
foreach my \$y (0 .. \$#\$set2) {
push(@product, [\$set1->[\$x], \$set2->[\$y]]);
}
}
\@product;
}

I daresay I just answered a homework question for you, but so be it.

Matt

Replies are listed 'Best First'.
Question
by waxmop (Beadle) on Apr 16, 2003 at 15:31 UTC

At the end of the program, you just do

```\@product;
Does this do the same thing as
```return \@product;
???
Re: Re: Creating tuples based on sets
by perlguy (Deacon) on Apr 16, 2003 at 15:31 UTC
There is a definite possibility that I am missing something, but isn't waxmop asking for something that will solve for an arbitrary number of elements (in the solution), not just 2 necessarily?

Yeah, I need the function to fit any of these situations:

```my @set1 = qw(A B C D);
my @set2 = qw(X Y Z);
mk_tuples(@set1, 2);
mk_tuples(@set2, 5);
```mk_tuples(["A", "B"], 3);
```my \$arrayref = ["A", "B"];