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 wird Ihnen helfen zu verstehen, wie der Basisfall und der rekursive Schritt in echtem Code zusammenarbeiten.
Eine Countdown-Funktion beginnt mit einer Zahl und gibt jede Zahl bis Null aus. So lässt sich dies mit Rekursion umsetzen: 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 anhalten
}
print(number);
countdown(number - 1); // Rekursiver Schritt
}Der Basisfall prüft, ob number <= 0 – dies ist der Zeitpunkt, an dem wir aufhören, die Funktion aufzurufen. Der rekursive Schritt ruft countdown(number - 1) auf, was dasselbe Problem ist, aber mit einer kleineren Eingabe, was uns schrittweise dem Basisfall näher bringt.
Wenn du countdown(3) aufrufst, gibt es 3 aus, ruft dann countdown(2) auf, was 2 ausgibt, ruft dann countdown(1) auf, was 1 ausgibt, und ruft dann countdown(0) auf, was "Done!" ausgibt und stoppt.
Aufgabe
EinfachErstellen Sie ein Programm, das einen rekursiven Countdown-Timer mit benutzerdefinierten Nachrichten implementiert. Ihr Programm wird Rekursion demonstrieren, indem es von einer gegebenen Zahl herunterzählt und bei jedem Schritt personalisierte Nachrichten anzeigt.
- Lesen Sie eine String-Eingabe ein, die die Startnummer für den Countdown darstellt
- Lesen Sie eine String-Eingabe ein, die ein benutzerdefiniertes Nachrichten-Präfix darstellt (z. B.
"Launch in","Timer"oder"Countdown") - Konvertieren Sie die erste Eingabe mit
int.parse()in eine Ganzzahl - Erstellen Sie eine rekursive Funktion namens
customCountdown, die zwei Parameter entgegennimmt: - Eine Ganzzahl
number, die den aktuellen Countdown-Wert darstellt - Einen String
messagePrefixfür die benutzerdefinierte Nachricht - Die Funktion sollte die folgende Logik implementieren:
- Basisfall: Wenn die Zahl kleiner oder gleich 0 ist, geben Sie
"Countdown complete!"aus und beenden Sie die Funktion - Rekursiver Schritt: Geben Sie das Nachrichten-Präfix gefolgt von der aktuellen Zahl aus und rufen Sie sich dann selbst mit
number - 1auf - Rufen Sie die Funktion
customCountdownmit der konvertierten Zahl und dem Nachrichten-Präfix auf - Zeigen Sie die Ergebnisse in dem unten gezeigten exakten Format an
Wenn die Eingaben beispielsweise "5" und "Launch in" sind, sollte Ihr 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" sind, sollte Ihr Programm Folgendes ausgeben:
Starting countdown from: 3
Message prefix: Timer
========================
Timer 3
Timer 2
Timer 1
Countdown complete!Wenn die Eingaben "0" und "Ready" sind, sollte Ihr Programm Folgendes ausgeben:
Starting countdown from: 0
Message prefix: Ready
========================
Countdown complete!Ihr Programm muss die rekursive Funktion customCountdown implementieren, die sich selbst mit einer dekrementierten Zahl aufruft, bis sie den Basisfall erreicht. Die Funktion sollte bei jedem rekursiven Aufruf die benutzerdefinierte Nachricht mit der aktuellen Zahl ausgeben und so demonstrieren, wie Rekursion das Problem in kleinere, identische Teilprobleme zerlegt. Verwenden Sie String-Interpolation, um die Countdown-Nachrichten als "$messagePrefix $number" zu formatieren.
Spickzettel
Eine rekursive Countdown-Funktion zeigt, wie Rekursion funktioniert, indem sie von einer Zahl bis auf Null herunterzählt:
void countdown(int number) {
if (number <= 0) {
print("Done!");
return; // Base case - stop here
}
print(number);
countdown(number - 1); // Recursive step
}Der Basisfall prüft, ob number <= 0 ist, um die Rekursion zu stoppen. Der rekursive Schritt ruft dieselbe Funktion mit number - 1 auf und bewegt sich so auf den Basisfall zu.
Beim Aufruf von countdown(3) wird 3 → 2 → 1 → "Done!" ausgegeben, indem aufeinanderfolgende rekursive Aufrufe mit dekrementierten Werten durchgeführt werden.
Probier es selbst
import 'dart:io';
// TODO: Erstellen Sie hier Ihre customCountdown-Funktion
// Denken Sie daran, den Basisfall (number <= 0) und den rekursiven Schritt zu behandeln
void main() {
// Eingabe lesen
String? startingNumber = stdin.readLineSync();
String? messagePrefix = stdin.readLineSync();
// String in Ganzzahl umwandeln
int number = int.parse(startingNumber!);
// Anfangsinformationen anzeigen
print('Starting countdown from: $number');
print('Message prefix: $messagePrefix');
print('========================');
// TODO: Rufen Sie hier Ihre customCountdown-Funktion auf
// Denken Sie daran, die Null-Sicherheit für messagePrefix zu behandeln
}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