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