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);
      etc...

      Here's a side question. How come this doesnt' work in perl?

      mk_tuples(["A", "B"], 3);
      I can't replace an array with just a list of elements.

        but you can... try this:

        my $arrayref = ["A", "B"]; print join "\n", @$arrayref;