Рекурсивная функция: обратный отсчёт
Часть раздела Логика и управление потоком путешествия по 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!" и останавливается.
Задание
ЛегкоCreate программу, которая реализует recursive таймер обратного отсчёта с пользовательскими сообщениями. Ваша программа продемонстрирует рекурсию, выполняя обратный отсчёт от заданного числа и отображая персонализированные сообщения на каждом шаге.
- Считайте строковый input, представляющий starting number для обратного отсчёта
- Считайте строковый input, представляющий пользовательский префикс сообщения (например,
"Launch in","Timer"или"Countdown") - Преобразуйте первый input в integer с помощью
int.parse() - Create recursive function с именем
customCountdown, которая принимает два параметра: - integer
number, представляющий текущее значение обратного отсчёта - строка
messagePrefixдля пользовательского сообщения - Функция должна реализовывать следующую логику:
- Base case: если число меньше или равно 0, выведите
"Countdown complete!"и выполните return - Recursive step: выведите префикс сообщения, за которым следует текущее число, затем вызовите функцию ещё раз с параметром
number - 1 - Вызовите функцию
customCountdownс преобразованными number и messagePrefix - Отобразите результаты в точном формате, показанном ниже
Например, если 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
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутая работа со списками
Свойства списка: first и lastСостояние списка: isEmpty и isNotEmptyРазворот спискаДобавление в список: insertУдаление из списка: removeWhereПоиск в списке: indexOfСортировка спискаПеремешивание спискаИтоги — Органайзер списков4Продвинутая работа с Map
Итерация по MapПроверка ключей и значенийСвойства Map: keys и valuesУсловное добавление: putIfAbsentУдаление записей из MapВложенные MapИтоги — Обновление инвентаря7Продвинутые функции
Анонимные функцииПередача функций в качестве аргументовПонимание замыканийВведение в рекурсиюРекурсивная функция: обратный отсчётРекурсивная функция: факториалИтоги — Обработчик списков2Функциональные операции со списками
Преобразование с помощью 'map'Фильтрация с помощью 'where'Использование '.toList()'Проверка условий с помощью 'any'Условия с 'every'Поиск с помощью 'firstWhere'Повторение — фильтрация данных5Проект: Калькулятор корзины
Настройка проектаДобавление товаров в корзину3Множества
Что такое множество?Создание множестваДобавление и удаление элементовПроверка наличия элементов в множествеПреобразование списка в множествоОбъединение множествПересечение множествРазность множествИтоги: уникальный список гостейПотренируйтесь самостоятельно: Онлайн-компилятор Dart