Vinzenz Mai: Zeichenliste aus zulässigen Zeichen generieren

Beitrag lesen

Hallo Laura,

Unsere Techniker in der Firma schreiben für derarige Aufgaben immer unmengen an Stunden auf.

Du solltest bereits gelernt haben, dass das verschiedene Gründe hat, die man beim fertigen "Produkt" nicht auf Anhieb sieht:

Zunächst muss man Überlegungen anstellen, wie man das Ziel erreichen kann. Du hast gelernt, dass man prüfen muss, ob das "Produkt" richtig funktioniert (was oftmals nicht auf Anhieb der Fall ist), anschließend Fehler verbessern, ...

Das kostet alles Zeit, die Du selbst in den paar resultierenden Zeilen Code nicht siehst.

Das, was Du jetzt hast, funktioniert für zwei Stellen. Verbessern könntest Du es mit Martins Anmerkungen. Für dreibuchstabige Listen müsstest Du neuen Code schreiben. Es ist zwar nicht schwer, den vorhandenen Code anzupassen, aber wie Du selbst in Deinem Ausgangsbeitrag angemerkt hat, kann es ja nicht sein, dass Du für jede Anzahl von Stellen eine eigene Funktion schreibst. Also ist die derzeitige Lösung noch suboptimal und für die "Produktion" ungeeignet.

Eine elegante und flexible Lösung kannst Du mit selbstaufrufenden Funktionen schaffen:

Übergib einer Funktion die bisher ermittelte Zeichenkette, die Länge der Restzeichenkette und den Zeichenvorrat, aus dem die Zeichen zu nehmen sind:

Wenn die Länge der Restzeichenkette größer ist als 0
    Für jedes Zeichen aus dem Zeichenvorrat
        Hänge an die bisher ermittelte Zeichenkette das aktuelle Zeichen an
        Die Länge der Restzeichenkette verringere um 1
        Rufe die Funktion mit diesen modifizierten Werten erneut auf
    Ende Für
Sonst
    Restzeichenkettenlänge ist Null: gib die Zeichenkette aus
Ende Wenn

oder in PHP:

function print_all_strings($string, $length, $zeichenvorrat) {  
  # Muss noch etwas angehängt werden?  
  if($length > 0) {  
    # Ja  
    # hänge systematisch alle Zeichen aus dem Zeichenvorrat an  
    foreach ($zeichenvorrat as $zeichen) {  
        # rufe die Funktion mit  
	print_all_strings(  
          # angehängtem Zeichen  
          $string . $zeichen,  
          # einer um 1 kleineren Restlänge  
          $length - 1,  
          # und dem immer noch gleichen Zeichenvorrat erneut auf  
          $zeichenvorrat);  
    }  
  }  
  else {  
    # Nein, die Zeichenkette ist fertig zusammengebaut  
    # Gib sie aus  
    echo $string, "<br>\n";  
  }  
}

Beispielaufruf für Deine Aufgabenstellung:

$zeichen = array ('1','2','3','4','5','6','7','8','9','0',' ','-','.','ö','ä','ü','ß','&','§','$','%','@','€','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');  
  
# Alle Zeichenketten der Längen von 1 bis 6  
for($length = 1; $length <= 6; $length++) {  
   # Start mit einer leeren Zeichenkette,  
   # der entsprechenden Maximallänge  
   # und Deinem Zeichenvorrat  
   print_all_strings('', $length, $zeichen);  
   # viel Spass beim Durchrattern der Milliarden Möglichkeiten :-)  
}  

Und ja: so einen Ansatz schüttelst Du Dir nicht einfach so aus dem Ärmel.
Da die Rekursionstiefe hier durch die Länge beschränkt ist, ist der zusätzliche Speicherplatzverbrauch durch die Rekursion übrigens vernachlässigbar.

Freundliche Grüße

Vinzenz