Thread Zahlenkombinationen suchen
(16 answers)
Opened by hugenyn at 2010-10-22 00:55
Das hier:
Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 my @hand = qw (a b c d); my @ch = @hand; for (@hand) { $k = $_; for (0..$#ch) { push (@ch, $k.$ch[$_]) unless $ch[$_] =~ /$k/; } } say "@ch\n"; Ist schon fast richtig. Du hast nur einen Fehler gemacht, indem du mit @ch = @hand schon am Anfang werte eingefügt hast. Dadurch bekamst du zu viele Kombinationen. Wenn du das in der Schleife mit push(@ch,$k); machst, funktioniert es korrekt. Hier der Code etwas anders geschrieben: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #!/usr/bin/perl use strict; use warnings; my @hand = qw (a b c d); my @ch; for my $k (@hand) { push(@ch,$k); for my $lst (@ch) { push (@ch, $k.$lst) if index($lst,$k)==-1; } } print join("\n",@ch)."\n"; Allso die Lösung ist an sich schon OK, nur bekommst du Probleme wenn du mehrere gleiche werte in der "Hand" hast. Du Musst die Kombinationen der Positionen durch gehen, nicht die Werte selber. Diese kannst du später auch noch gebrauchen. Also hier das ganze mit den Positionen: Code (perl): (dl
)
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 #!/usr/bin/perl use strict; use warnings; my @hand = qw(a b c d); # Liste mit den Ergebnissen my @ch; # gehe die POSITIONEN in der Hand durch for my $p (0..$#hand) { # füge die Position in @ch ein push(@ch,[$p]); # gehe alle Elemnte in @ch durch for my $elm (@ch) { # hole die Liste aus @$lem # ist eine Kopie my @l=@$elm; # schaue in der Liste nach, ob die Position schon drin ist unless(grep{$p==$_}@l) { # füge die Position zur Liste hinzu push(@l,$p); # sortiere es # ist dann später übersichtlicher :-) @l=sort(@l); #füge diese Kombination als neue hinzu push (@ch, \@l); } } } ############## #Ausgabe: #### ############## # gehe alles durch for my $c (@ch) { # gehe die einzelne Kombination durch for my $cc (@$c) { print $hand[$cc]." "; } print "\n"; } Du hast das, was ich rekursiv geschrieben habe, iterativ gelöst. Jeder iterative Code lässt sich auch rekursiv schreiben und umgekehrt. |