Menu
Coddy logo textTech

Рекурсивная функция: обратный отсчёт

Часть раздела Логика и управление потоком путешествия по Dart на Coddy. Урок 48 из 65.

Теперь пришло время применить рекурсию на практике с помощью простой функции countdown. Это упражнение поможет вам понять, как base case и recursive step работают вместе в реальном коде.

A countdown function начинается с числа и print каждое число до нуля. Вот как рекурсия обеспечивает эту работу: если number больше нуля, print его, а затем вызови ту же function с меньшим числом. Когда number достигает нуля, остановись.

void countdown(int number) {
  if (number <= 0) {
    print("Done!");
    return; // Базовый случай - остановиться здесь
  }
  
  print(number);
  countdown(number - 1); // Рекурсивный шаг
}

Проверка base case определяет, является ли number <= 0 условием остановки вызовов function. Recursive step вызывает countdown(number - 1) — это та же задача, но с меньшим входным значением, что постепенно приближает нас к base case.

Когда вы вызываете countdown(3), она выводит 3, затем вызывает countdown(2), которая выводит 2, затем вызывает countdown(1), которая выводит 1, затем вызывает countdown(0), которая выводит "Done!" и останавливается.

challenge icon

Задание

Легко

Create программу, которая реализует recursive таймер обратного отсчёта с пользовательскими сообщениями. Ваша программа продемонстрирует рекурсию, выполняя обратный отсчёт от заданного числа и отображая персонализированные сообщения на каждом шаге.

  1. Считайте строковый input, представляющий starting number для обратного отсчёта
  2. Считайте строковый input, представляющий пользовательский префикс сообщения (например, "Launch in", "Timer" или "Countdown")
  3. Преобразуйте первый input в integer с помощью int.parse()
  4. Create recursive function с именем customCountdown, которая принимает два параметра:
    • integer number, представляющий текущее значение обратного отсчёта
    • строка messagePrefix для пользовательского сообщения
  5. Функция должна реализовывать следующую логику:
    • Base case: если число меньше или равно 0, выведите "Countdown complete!" и выполните return
    • Recursive step: выведите префикс сообщения, за которым следует текущее число, затем вызовите функцию ещё раз с параметром number - 1
  6. Вызовите функцию customCountdown с преобразованными number и messagePrefix
  7. Отобразите результаты в точном формате, показанном ниже

Например, если input — "5" и "Launch in", ваша программа должна вывести:

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!

Если input — "3" и "Timer", ваша программа должна вывести:

Starting countdown from: 3
Message prefix: Timer
========================
Timer 3
Timer 2
Timer 1
Countdown complete!

Если input — "0" и "Ready", ваша программа должна вывести:

Starting countdown from: 0
Message prefix: Ready
========================
Countdown complete!

Ваша программа должна реализовать recursive функцию customCountdown, которая вызывает себя с уменьшенным number, пока не достигнет Base case. Функция должна выводить пользовательское сообщение с текущим number при каждом recursive вызове, демонстрируя, как рекурсия разбивает задачу на меньшие идентичные подзадачи. Используйте интерполяцию строк для форматирования сообщений обратного отсчёта в виде "$messagePrefix $number".

Попробуйте сами

import 'dart:io';

// TODO: Создайте вашу функцию customCountdown здесь
// Не забудьте обработать базовый случай (number <= 0) и рекурсивный шаг

void main() {
  // Прочитать ввод
  String? startingNumber = stdin.readLineSync();
  String? messagePrefix = stdin.readLineSync();
  
  // Преобразовать строку в целое число
  int number = int.parse(startingNumber!);
  
  // Отобразить начальную информацию
  print('Starting countdown from: $number');
  print('Message prefix: $messagePrefix');
  print('========================');
  
  // TODO: Вызовите вашу функцию customCountdown здесь
  // Remember to handle null safety for messagePrefix
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Онлайн-компилятор Dart