Thread Zahlenkombinationen suchen (16 answers)
Opened by hugenyn at 2010-10-22 00:55

topeg
 2010-11-05 15:32
#142496 #142496
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
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.

View full thread Zahlenkombinationen suchen