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 simple de cuenta regresiva. Este ejercicio te ayudará a comprender cómo funcionan juntos el caso base y el paso recursivo 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 recursión hace que esto funcione: si el número es mayor que cero, imprímelo y después llama a la misma función con un número menor. Cuando el número llega 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: este es el momento en que 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, lo que nos acerca gradualmente al caso base.
Cuando llamas a countdown(3), imprime 3, después llama a countdown(2), que imprime 2, después llama a countdown(1), que imprime 1, después 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 recursión contando hacia atrás desde un número dado y mostrando mensajes personalizados en cada paso.
- Lee una entrada de tipo cadena que represente el número inicial de la cuenta regresiva
- Lee una entrada de tipo cadena que represente un prefijo de mensaje personalizado (por ejemplo,
"Launch in","Timer"o"Countdown") - Convierte la primera entrada en un entero usando
int.parse() - Crea una función recursiva llamada
customCountdownque reciba dos parámetros: - Un entero
numberque represente 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 que 0, imprime
"Countdown complete!"y retorna - Paso recursivo: Imprime el prefijo del mensaje seguido del número actual; después, se llama a sí misma con
number - 1 - Llama a la función
customCountdowncon el número convertido y el prefijo del mensaje - Muestra los resultados exactamente en el formato que aparece 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 alcanzar el caso base. La función debe imprimir el mensaje personalizado con el número actual en cada llamada recursiva, demostrando cómo la recursión descompone el problema en subproblemas más pequeños e idénticos. Usa la interpolación de cadenas para dar formato a los mensajes de la cuenta regresiva como "$messagePrefix $number".
Pruébalo tú mismo
import 'dart:io';
// TODO: Crea tu función customCountdown aquí
// Recuerda manejar el caso base (number <= 0) y el paso recursivo
void main() {
// Leer la entrada
String? startingNumber = stdin.readLineSync();
String? messagePrefix = stdin.readLineSync();
// Convertir string a entero
int number = int.parse(startingNumber!);
// Mostrar la información inicial
print('Starting countdown from: $number');
print('Message prefix: $messagePrefix');
print('========================');
// TODO: Llama a tu función customCountdown aquí
// Remember to handle null safety for 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 únicaPractica por tu cuenta: Compilador de Dart online