#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my $A = [ 'a', 'b', 'c', 'd', 'e' ]; my $P = P($A); print "A = {", join(', ', @$A), "}\n"; print "P(A) = {\n"; for my $p (@$P) { print " {", join(', ', @$p), "},\n"; } print " }\n"; sub P { my ($A) = @_; my $P = []; for my $anzahl_elemente (0 .. scalar @$A) { push @$P, teilmengen($A, $anzahl_elemente); } return $P; } sub teilmengen { my ($A, $n) = @_; my @T = (); my $N = scalar @$A; if (0 == $n) { push @T, []; } else { # $n Elemente aus $N Elementen auswaehlen: my @Mengen; # Menge mit Nummermengen for my $element (1..$n) { my @M; # Moegliche Nummern fuer Element $element berechnen: for my $nummer ($element..$N-($n-$element)) { push @M, $nummer-1; } # Bei einelementigen Mengen Mengen mit nur diesem Element # erzeugen: unless (@Mengen) { push @Mengen, [ $_ ] for @M } # Anderenfalls Jede bisherige Nummernmenge aus @Mengen # vervielfachen und an jede Kopie eine der neuen # moeglichen Nummern anhaengen: else { my @TM = @Mengen; @Mengen = (); for my $tm (@TM) { for my $m (@M) { unless (grep { $_ >= $m } @$tm) { push @Mengen, [ @$tm, $m ]; } } } } } # Umsetzen der Nummern auf die Elemente der Menge: for my $menge (@Mengen) { push @T, [ map { $_ = $A->[$_] } @$menge ]; } } return @T; }