yitzle schreef:
> In a personal email conversation, he realized what he was actually
> looking for is the power set.
> List::PowerSet
> http://search.cpan.org/~nikc/List-PowerSet-0.01/lib/List/PowerSet.pm

#!/usr/bin/perl
use strict;
use warnings;

use Data::Dumper;

sub powerset {
  my $set = shift;
  my $powerset = [];
  my $n = @$set;
  for my $i (0 .. 2 ** $n - 1) {
    my $subset = [];
    for my $j (0 .. $n - 1) {
      push @$subset, $set->[$j] if ($i & 2 ** $j);
    }
    push @$powerset, $subset;
  }
  return $powerset;
}

sub powersubset {
  my ($set, $n, $i) if 0;

  if (@_) {
    if (ref $_[0] eq "ARRAY") {
        $set = $_[0];
        $n   = @$set;
        if (@_ > 1) {
          $i = $_[1];
        }
        else {
          $i = undef;
          return;
        }
    }
    else {
      $i = $_[0];
    }
  }
  else {
    $i = (defined $i) ? $i + 1 : 0;
    return if $i >= 2 ** $n;
  }

  my $subset = [];
  for my $j (0 .. $n - 1) {
    push @$subset, $set->[$j] if ($i & 2 ** $j);
  }
  return $subset;
}

my $set = ['foo', 'bar', 'baz'];

my $powerset = powerset($set);
print Dumper $powerset;
print "-"x40, "\n";


my $powersubset = powersubset($set);
print Dumper $powersubset;

$powersubset = powersubset() for 0..2;
print Dumper $powersubset;

$powersubset = powersubset($_) for 0..2;
print Dumper $powersubset;

$powersubset = powersubset() for 0..2;
print Dumper $powersubset;
print "-"x40, "\n";


powersubset($set);
while (defined($powersubset = powersubset())) {
  print Dumper $powersubset;
}
print "-"x40, "\n";


$powersubset = powersubset($set, 2);
print Dumper $powersubset;

__END__

-- 
Affijn, Ruud

"Gewoon is een tijger."

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to