Función recursiva: Cuenta regresiva
Parte de la sección Lógica y Flujo del Journey de Dart de Coddy — lección 48 de 65.
Ahora es el momento de poner en práctica la recursividad con una función de cuenta regresiva sencilla. Este ejercicio te ayudará a entender cómo el caso base y el paso recursivo funcionan juntos en código real.
Una función de cuenta regresiva comienza con un número e imprime cada número hasta llegar a cero. Así es como la recursividad hace que esto funcione: si el número es mayor que cero, imprímelo y luego llama a la misma función con un número menor. Cuando el número llegue a cero, detente.
void countdown(int number) {
if (number <= 0) {
print("Done!");
return; // Caso base - detenerse aquí
}
print(number);
countdown(number - 1); // Paso recursivo
}El caso base comprueba si number <= 0 - aquí es cuando dejamos de llamar a la función. El paso recursivo llama a countdown(number - 1), que es el mismo problema pero con una entrada más pequeña, moviéndonos gradualmente hacia el caso base.
Cuando llamas a countdown(3), imprime 3, luego llama a countdown(2), que imprime 2, luego llama a countdown(1), que imprime 1, luego llama a countdown(0), que imprime "Done!" y se detiene.
Desafío
FácilCrea un programa que implemente un temporizador de cuenta regresiva recursivo con mensajes personalizados. Tu programa demostrará la recursividad contando hacia atrás desde un número dado y mostrando mensajes personalizados en cada paso.
- Lee una entrada de cadena que represente el número inicial para la cuenta regresiva
- Lee una entrada de cadena que represente un prefijo de mensaje personalizado (por ejemplo,
"Launch in","Timer"o"Countdown") - Convierte la primera entrada a un entero usando
int.parse() - Crea una función recursiva llamada
customCountdownque tome dos parámetros: - Un entero
numberque representa el valor actual de la cuenta regresiva - Una cadena
messagePrefixpara el mensaje personalizado - La función debe implementar la siguiente lógica:
- Caso base: Si el número es menor o igual a 0, imprime
"Countdown complete!"y retorna - Paso recursivo: Imprime el prefijo del mensaje seguido del número actual, luego llámate a ti mismo con
number - 1 - Llama a la función
customCountdowncon el número convertido y el prefijo del mensaje - Muestra los resultados en el formato exacto que se muestra a continuación
Por ejemplo, si las entradas son "5" y "Launch in", tu programa debería mostrar:
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!Si las entradas son "3" y "Timer", tu programa debería mostrar:
Starting countdown from: 3
Message prefix: Timer
========================
Timer 3
Timer 2
Timer 1
Countdown complete!Si las entradas son "0" y "Ready", tu programa debería mostrar:
Starting countdown from: 0
Message prefix: Ready
========================
Countdown complete!Tu programa debe implementar la función recursiva customCountdown que se llama a sí misma con un número decrementado hasta que alcanza el caso base. La función debe imprimir el mensaje personalizado con el número actual en cada llamada recursiva, demostrando cómo la recursividad divide el problema en subproblemas más pequeños e idénticos. Usa la interpolación de cadenas para formatear los mensajes de cuenta regresiva como "$messagePrefix $number".
Hoja de referencia
Una función de cuenta regresiva recursiva demuestra cómo funciona la recursividad contando hacia atrás desde un número hasta cero:
void countdown(int number) {
if (number <= 0) {
print("Done!");
return; // Caso base - detenerse aquí
}
print(number);
countdown(number - 1); // Paso recursivo
}El caso base verifica si number <= 0 para detener la recursividad. El paso recursivo llama a la misma función con number - 1, avanzando hacia el caso base.
Al llamar a countdown(3), imprime 3 → 2 → 1 → "Done!" realizando llamadas recursivas sucesivas con valores decrementados.
Pruébalo tú mismo
import 'dart:io';
// TODO: Crea tu función customCountdown aquí
// Recuerda manejar el caso base (número <= 0) y el paso recursivo
void main() {
// Leer entrada
String? startingNumber = stdin.readLineSync();
String? messagePrefix = stdin.readLineSync();
// Convertir cadena a entero
int number = int.parse(startingNumber!);
// Mostrar información inicial
print('Starting countdown from: $number');
print('Message prefix: $messagePrefix');
print('========================');
// TODO: Llama a tu función customCountdown aquí
// Recuerda manejar la seguridad de nulos para messagePrefix
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
1Manipulación avanzada de listas
Propiedades de listas: first y lastEstado de la lista: isEmpty y isNotEmptyInvertir una listaAñadir a una lista: insertEliminación en listas: removeWhereBúsqueda en una lista: indexOfOrdenar una listaMezclar una listaResumen - Organizador de listas4Manipulación avanzada de mapas
Iterar sobre un mapaComprobación de claves y valoresPropiedades del mapa: keys y valuesAdición condicional: putIfAbsentEliminar entradas de un mapaMapas anidadosResumen - Actualización de inventario7Funciones avanzadas
Funciones anónimasPasar funciones como argumentosEntendiendo los ClosuresIntroducción a la recursividadFunción recursiva: Cuenta regresivaFunción recursiva: FactorialResumen - Procesador de listas2Operaciones funcionales con listas
Transformar con 'map'Filtrar con 'where'Uso de '.toList()'Comprobar condiciones con 'any'Condiciones con 'every'Búsqueda con 'firstWhere'Resumen - Filtrado de datos5Proyecto: Calculadora de carrito de compras
Configuración del proyectoAgregar artículos al carrito3Conjuntos
¿Qué es un Conjunto?Crear un ConjuntoAñadir y eliminar elementos de un ConjuntoComprobar elementos en un ConjuntoConvertir una lista en un ConjuntoUnión de ConjuntosIntersección de ConjuntosDiferencia de ConjuntosResumen - Lista de invitados única