Und hier noch eine zweite Variante von mir, wo alles in einer Funktion P zusammengefasst ist:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#!/usr/bin/perl
# Autor: Crian
# RDW 02 - Berechnung der Potenzmenge einer Menge
# Variante 2
use strict;
use warnings;
my $A = [ 'a', 'b', 'c', 'd', 'e' ];
my $P = P($A);
print_A_und_P($A, $P);
sub print_A_und_P {
my ($A, $P) = @_;
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 = [[]];
my $N = scalar @$A;
# In jedem Schleifendurchlauf der folgenden for-Schleife wird
# die Menge der $n elementigen Mengen aus $N Elementen gebildet:
for my $n (1..$N) {
# $n Elemente aus $N Elementen auswaehlen:
my @Mengen; # Menge mit Nummermengen
for my $element (1..$n) {
# Moegliche Nummern fuer Element $element belegen:
my @M = $element-1 .. $N-($n-$element)-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
# und Abspeichern der sich ergebenden Mengen:
for my $menge (@Mengen) {
push @$P, [ map { $_ = $A->[$_] } @$menge ];
}
}
return $P;
}
\n\n
<!--EDIT|Crian|1090395176-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;
use strict; use warnings; Link zu meiner Perlseite