Funkcja rekurencyjna: odliczanie
Część sekcji Logika i przepływ sterowania ścieżki Dart w Coddy. Lekcja 48 z 65.
Teraz czas zastosować rekurencję w praktyce za pomocą prostej funkcji odliczającej. To ćwiczenie pomoże Ci zrozumieć, jak przypadek bazowy i krok rekurencyjny współdziałają w prawdziwym kodzie.
Funkcja odliczająca zaczyna od liczby i wypisuje kolejno liczby aż do zera. Oto jak rekurencja to umożliwia: jeśli liczba jest większa od zera, wypisz ją, a następnie wywołaj tę samą funkcję z mniejszą liczbą. Gdy liczba osiągnie zero, zatrzymaj się.
void countdown(int number) {
if (number <= 0) {
print("Done!");
return; // Przypadek bazowy - zatrzymaj się tutaj
}
print(number);
countdown(number - 1); // Krok rekurencyjny
}Przypadek bazowy sprawdza, czy number <= 0 — wtedy przestajemy wywoływać funkcję. Krok rekurencyjny wywołuje countdown(number - 1), czyli rozwiązuje ten sam problem, ale z mniejszym argumentem, stopniowo zbliżając nas do przypadku bazowego.
Gdy wywołasz countdown(3), wypisuje 3, następnie wywołuje countdown(2), które wypisuje 2, następnie wywołuje countdown(1), które wypisuje 1, następnie wywołuje countdown(0), które wypisuje "Done!" i się zatrzymuje.
Wyzwanie
ŁatwyUtwórz program implementujący rekurencyjny minutnik odliczający czas z własnymi komunikatami. Twój program zademonstruje rekurencję, odliczając od podanej liczby i wyświetlając spersonalizowane komunikaty na każdym kroku.
- Wczytaj dane wejściowe w postaci ciągu znaków reprezentującego początkową liczbę odliczania
- Wczytaj dane wejściowe w postaci ciągu znaków reprezentującego własny przedrostek komunikatu (np.
"Launch in","Timer"lub"Countdown") - Przekonwertuj pierwsze dane wejściowe na liczbę całkowitą za pomocą
int.parse() - Utwórz funkcję rekurencyjną o nazwie
customCountdown, która przyjmuje dwa parametry: - Liczbę całkowitą
numberreprezentującą bieżącą wartość odliczania - Ciąg znaków
messagePrefixbędący własnym komunikatem - Funkcja powinna realizować następującą logikę:
- Przypadek bazowy: Jeśli liczba jest mniejsza lub równa 0, wypisz
"Countdown complete!"i zakończ działanie - Krok rekurencyjny: Wypisz przedrostek komunikatu, a następnie bieżącą liczbę, po czym wywołaj funkcję ponownie z argumentem
number - 1 - Wywołaj funkcję
customCountdownz przekonwertowaną liczbą i przedrostkiem komunikatu - Wyświetl wyniki dokładnie w formacie pokazanym poniżej
Na przykład, jeśli dane wejściowe to "5" i "Launch in", program powinien wypisać:
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!Jeśli dane wejściowe to "3" i "Timer", program powinien wypisać:
Starting countdown from: 3
Message prefix: Timer
========================
Timer 3
Timer 2
Timer 1
Countdown complete!Jeśli dane wejściowe to "0" i "Ready", program powinien wypisać:
Starting countdown from: 0
Message prefix: Ready
========================
Countdown complete!Twój program musi implementować rekurencyjną funkcję customCountdown, która wywołuje samą siebie ze zmniejszoną liczbą, aż osiągnie przypadek bazowy. Funkcja powinna wypisywać własny komunikat z bieżącą liczbą przy każdym wywołaniu rekurencyjnym, demonstrując, jak rekurencja rozkłada problem na mniejsze, identyczne podproblemy. Użyj interpolacji ciągów znaków, aby formatować komunikaty odliczania jako "$messagePrefix $number".
Spróbuj swoich sił
import 'dart:io';
// TODO: Utwórz tutaj funkcję customCountdown
// Pamiętaj o obsłudze przypadku bazowego (number <= 0) i kroku rekurencyjnego
void main() {
// Odczytaj dane wejściowe
String? startingNumber = stdin.readLineSync();
String? messagePrefix = stdin.readLineSync();
// Przekonwertuj ciąg znaków na liczbę całkowitą
int number = int.parse(startingNumber!);
// Wyświetl informacje początkowe
print('Starting countdown from: $number');
print('Message prefix: $messagePrefix');
print('========================');
// TODO: Wywołaj tutaj funkcję customCountdown
// Pamiętaj o obsłudze wartości null dla messagePrefix
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ sterowania
1Zaawansowana manipulacja listami
Właściwości listy: first i lastStan listy: isEmpty i isNotEmpOdwracanie listyDodawanie do listy: insertUsuwanie z listy: removeWhereWyszukiwanie na liście: indexOfSortowanie listyMieszanie elementów listyPodsumowanie – Organizator listy4Zaawansowane operacje na mapach
Iterowanie po mapieSprawdzanie kluczy i wartościWłaściwości mapy: klucze i wartościDodawanie warunkowe: putIfAbsentUsuwanie wpisów z mapyZagnieżdżone mapyPodsumowanie – aktualizacja stanu magazynowego7Zaawansowane funkcje
Funkcje anonimowePrzekazywanie funkcji jako argumentówZrozumienie domknięćWprowadzenie do rekurencjiFunkcja rekurencyjna: odliczanieFunkcja rekurencyjna: silniaPowtórzenie – przetwarzanie listy2Operacje funkcyjne na listach
Przekształcanie za pomocą 'map'Filtrowanie za pomocą 'where'Używanie '.toList()'Sprawdzanie warunków za pomocą 'any'Warunki z użyciem 'every'Wyszukiwanie za pomocą 'firstWhere'Podsumowanie — filtrowanie danych5Projekt: Kalkulator koszyka zakupowego
Konfiguracja projektuDodawanie produktów do koszyka3Zbiory
Czym jest zbiór?Tworzenie zbioruDodawanie i usuwanie elementów ze zbiorówSprawdzanie, czy element znajduje się w zbiorzeKonwersja listy na zbiórSuma zbiorówCzęść wspólna zbiorówRóżnica zbiorówPodsumowanie — unikalna lista gościPoćwicz samodzielnie: Kompilator Dart online