Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Łatwy

Utwó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.

  1. Wczytaj dane wejściowe w postaci ciągu znaków reprezentującego początkową liczbę odliczania
  2. Wczytaj dane wejściowe w postaci ciągu znaków reprezentującego własny przedrostek komunikatu (np. "Launch in", "Timer" lub "Countdown")
  3. Przekonwertuj pierwsze dane wejściowe na liczbę całkowitą za pomocą int.parse()
  4. Utwórz funkcję rekurencyjną o nazwie customCountdown, która przyjmuje dwa parametry:
    • Liczbę całkowitą number reprezentującą bieżącą wartość odliczania
    • Ciąg znaków messagePrefix będący własnym komunikatem
  5. 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
  6. Wywołaj funkcję customCountdown z przekonwertowaną liczbą i przedrostkiem komunikatu
  7. 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
}
quiz iconSprawdź się

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

Poćwicz samodzielnie: Kompilator Dart online