Rekursive Funktion: Countdown
Teil des Abschnitts Logik & Ablauf der Dart-Journey von Coddy. Lektion 48 von 65.
Jetzt ist es an der Zeit, Rekursion mit einer einfachen Countdown-Funktion in die Praxis umzusetzen. Diese Übung hilft dir zu verstehen, wie der Basisfall und der rekursive Schritt im echten Code zusammenwirken.
Eine Countdown-Funktion beginnt mit einer Zahl und gibt jede Zahl bis auf null aus. So funktioniert dies mithilfe von Rekursion: Wenn die Zahl größer als null ist, gib sie aus und rufe dann dieselbe Funktion mit einer kleineren Zahl auf. Wenn die Zahl null erreicht, stoppe.
void countdown(int number) {
if (number <= 0) {
print("Done!");
return; // Basisfall - hier stoppen
}
print(number);
countdown(number - 1); // Rekursiver Schritt
}Der Basisfall prüft, ob number <= 0 gilt – dann hören wir auf, die Funktion aufzurufen. Der rekursive Schritt ruft countdown(number - 1) auf. Dabei handelt es sich um dasselbe Problem, jedoch mit einer kleineren Eingabe, wodurch wir uns schrittweise dem Basisfall nähern.
Wenn du countdown(3) aufrufst, gibt es 3 aus, ruft dann countdown(2) auf, das 2 ausgibt, ruft dann countdown(1) auf, das 1 ausgibt, ruft dann countdown(0) auf, das „Done!“ ausgibt und stoppt.
Aufgabe
EinfachErstelle ein Programm, das einen rekursiven Countdown-Timer mit benutzerdefinierten Nachrichten implementiert. Dein Programm demonstriert Rekursion, indem es von einer vorgegebenen Zahl herunterzählt und bei jedem Schritt personalisierte Nachrichten anzeigt.
- Lies eine Zeichenketteneingabe ein, die die Startzahl für den Countdown darstellt
- Lies eine Zeichenketteneingabe ein, die ein benutzerdefiniertes Nachrichtenpräfix darstellt (z. B.
"Launch in","Timer"oder"Countdown") - Wandle die erste Eingabe mithilfe von
int.parse()in eine Ganzzahl um - Erstelle eine rekursive Funktion namens
customCountdown, die zwei Parameter entgegennimmt: - Eine Ganzzahl
number, die den aktuellen Countdown-Wert darstellt - Eine Zeichenkette
messagePrefixfür die benutzerdefinierte Nachricht - Die Funktion soll die folgende Logik implementieren:
- Basisfall: Wenn die Zahl kleiner oder gleich 0 ist, gib
"Countdown complete!"aus und kehre zurück - Rekursiver Schritt: Gib das Nachrichtenpräfix gefolgt von der aktuellen Zahl aus und rufe sich anschließend selbst mit
number - 1auf - Rufe die Funktion
customCountdownmit der umgewandelten Zahl und dem Nachrichtenpräfix auf - Zeige die Ergebnisse exakt im unten dargestellten Format an
Wenn die Eingaben beispielsweise "5" und "Launch in" lauten, sollte dein Programm Folgendes ausgeben:
Starting countdown from: 5
Message prefix: Launch in
========================
Launch in 5
Launch in 4
Launch in 3
Launch in 2
Launch in 1
Countdown complete!Wenn die Eingaben "3" und "Timer" lauten, sollte dein Programm Folgendes ausgeben:
Starting countdown from: 3
Message prefix: Timer
========================
Timer 3
Timer 2
Timer 1
Countdown complete!Wenn die Eingaben "0" und "Ready" lauten, sollte dein Programm Folgendes ausgeben:
Starting countdown from: 0
Message prefix: Ready
========================
Countdown complete!Dein Programm muss die rekursive Funktion customCountdown implementieren, die sich selbst mit einer um 1 verringerten Zahl aufruft, bis sie den Basisfall erreicht. Die Funktion soll bei jedem rekursiven Aufruf die benutzerdefinierte Nachricht mit der aktuellen Zahl ausgeben und dabei veranschaulichen, wie Rekursion ein Problem in kleinere, identische Teilprobleme zerlegt. Verwende String-Interpolation, um die Countdown-Nachrichten als "$messagePrefix $number" zu formatieren.
Probier es selbst
import 'dart:io';
// TODO: Erstelle hier deine customCountdown-Funktion
// Denke daran, den Basisfall (number <= 0) und den rekursiven Schritt zu behandeln
void main() {
// Eingabe lesen
String? startingNumber = stdin.readLineSync();
String? messagePrefix = stdin.readLineSync();
// Zeichenkette in Ganzzahl umwandeln
int number = int.parse(startingNumber!);
// Anfangsinformationen anzeigen
print('Starting countdown from: $number');
print('Message prefix: $messagePrefix');
print('========================');
// TODO: Rufe hier deine customCountdown-Funktion auf
// Remember to handle null safety for messagePrefix
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Fortgeschrittene Listenmanipulation
Listen-Eigenschaften: first & lastListen-Status: isEmpty & isNotEmptyEine Liste umkehrenHinzufügen zu einer Liste: insertElemente aus Liste entfernen: removeWhereSuchen in einer Liste: indexOfEine Liste sortierenEine Liste mischenZusammenfassung – Listen-Organizer4Fortgeschrittene Map-Manipulation
Über eine Map iterierenPrüfen auf Schlüssel und WerteMap-Eigenschaften: keys & valuesBedingtes Hinzufügen: putIfAbsentEinträge aus einer Map entfernenVerschachtelte MapsRückblick – Inventar-Update7Fortgeschrittene Funktionen
Anonyme FunktionenFunktionen als Argumente übergebenClosures verstehenEinführung in die RekursionRekursive Funktion: CountdownRekursive Funktion: FakultätZusammenfassung – List Processor10Abschluss-Herausforderungen
Herausforderung: NotensortiererHerausforderung: VokalzählerHerausforderung: FizzBuzz2Funktionale Listenoperationen
Transformieren mit 'map'Filtern mit 'where''.toList()' verwendenBedingungen prüfen mit 'any'Bedingungen mit 'every'Suchen mit 'firstWhere'Zusammenfassung – Datenfilterung3Sets
Was ist ein Set?Ein Set erstellenHinzufügen und Entfernen in SetsPrüfen auf Elemente in einem SetEine Liste in ein Set umwandelnSet-VereinigungSet-SchnittmengeSet-DifferenzRückblick – Einzigartige GästelisteÜbe selbstständig: Online-Dart-Compiler