Função Recursiva: Contagem Regressiva
Parte da seção Lógica & Fluxo do Journey de Dart da Coddy — lição 48 de 65.
Agora é hora de colocar a recursão em prática com uma função de contagem regressiva simples. Este exercício ajudará você a entender como o caso base e o passo recursivo funcionam juntos em um código real.
Uma função de contagem regressiva começa com um número e imprime cada número até chegar a zero. Veja como a recursão faz isso funcionar: se o número for maior que zero, imprima-o e, em seguida, chame a mesma função com um número menor. Quando o número chegar a zero, pare.
void countdown(int number) {
if (number <= 0) {
print("Done!");
return; // Caso base - pare aqui
}
print(number);
countdown(number - 1); // Passo recursivo
}O caso base verifica se number <= 0 - é quando paramos de chamar a função. O passo recursivo chama countdown(number - 1), que é o mesmo problema, mas com uma entrada menor, movendo-nos gradualmente em direção ao caso base.
Quando você chama countdown(3), ele imprime 3, então chama countdown(2), que imprime 2, então chama countdown(1), que imprime 1, então chama countdown(0), que imprime "Done!" e para.
Desafio
FácilCrie um programa que implemente um temporizador de contagem regressiva recursivo com mensagens personalizadas. Seu programa demonstrará a recursão contando regressivamente a partir de um número fornecido e exibindo mensagens personalizadas em cada etapa.
- Leia uma entrada de string representando o número inicial para a contagem regressiva
- Leia uma entrada de string representando um prefixo de mensagem personalizado (ex:
"Launch in","Timer", ou"Countdown") - Converta a primeira entrada para um número inteiro usando
int.parse() - Crie uma função recursiva chamada
customCountdownque recebe dois parâmetros: - Um número inteiro
numberrepresentando o valor atual da contagem regressiva - Uma string
messagePrefixpara a mensagem personalizada - A função deve implementar a seguinte lógica:
- Caso base: Se o número for menor ou igual a 0, imprima
"Countdown complete!"e retorne - Passo recursivo: Imprima o prefixo da mensagem seguido pelo número atual, então chame a si mesma com
number - 1 - Chame a função
customCountdowncom o número convertido e o prefixo da mensagem - Exiba os resultados no formato exato mostrado abaixo
Por exemplo, se as entradas forem "5" e "Launch in", seu programa deve imprimir:
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!Se as entradas forem "3" e "Timer", seu programa deve imprimir:
Starting countdown from: 3
Message prefix: Timer
========================
Timer 3
Timer 2
Timer 1
Countdown complete!Se as entradas forem "0" e "Ready", seu programa deve imprimir:
Starting countdown from: 0
Message prefix: Ready
========================
Countdown complete!Seu programa deve implementar a função recursiva customCountdown que chama a si mesma com um número decrementado até atingir o caso base. A função deve imprimir a mensagem personalizada com o número atual em cada chamada recursiva, demonstrando como a recursão divide o problema em subproblemas menores e idênticos. Use interpolação de string para formatar as mensagens de contagem regressiva como "$messagePrefix $number".
Folha de consulta
Uma função de contagem regressiva recursiva demonstra como a recursão funciona contando de um número até zero:
void countdown(int number) {
if (number <= 0) {
print("Done!");
return; // Caso base - pare aqui
}
print(number);
countdown(number - 1); // Passo recursivo
}O caso base verifica se number <= 0 para parar a recursão. O passo recursivo chama a mesma função com number - 1, movendo-se em direção ao caso base.
Ao chamar countdown(3), ele imprime 3 → 2 → 1 → "Done!" ao fazer chamadas recursivas sucessivas com valores decrementados.
Experimente você mesmo
import 'dart:io';
// TODO: Crie sua função customCountdown aqui
// Lembre-se de tratar o caso base (número <= 0) e o passo recursivo
void main() {
// Ler entrada
String? startingNumber = stdin.readLineSync();
String? messagePrefix = stdin.readLineSync();
// Converter string para inteiro
int number = int.parse(startingNumber!);
// Exibir informações iniciais
print('Starting countdown from: $number');
print('Message prefix: $messagePrefix');
print('========================');
// TODO: Chame sua função customCountdown aqui
// Lembre-se de tratar a segurança de nulos (null safety) para messagePrefix
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica & Fluxo
1Manipulação Avançada de Listas
Propriedades de Lista: first & lastEstado da Lista: isEmpty & isNotEmptyInvertendo uma ListaAdicionando a uma Lista: insertRemoção em Listas: removeWhereBuscando em uma Lista: indexOfOrdenando uma ListaEmbaralhando uma ListaRecapitulação - Organizador de Listas4Manipulação Avançada de Mapas
Iterando sobre um MapVerificando Chaves e ValoresPropriedades do Map: keys & valuesAdição Condicional: putIfAbsentRemovendo Entradas de um MapMaps AninhadosRecapitulação - Atualização de Inventário7Funções Avançadas
Funções AnônimasPassando Funções como ArgumentosEntendendo ClosuresIntrodução à RecursividadeFunção Recursiva: Contagem RegressivaFunção Recursiva: FatorialRecapitulação - Processador de Listas2Operações Funcionais em Listas
Transformando com 'map'Filtrando com 'where'Usando '.toList()'Verificando Condições com 'any'Condições com 'every'Encontrando com 'firstWhere'Recapitulação - Filtragem de Dados5Projeto: Cálculo de Carrinho de Compras
Configuração do ProjetoAdicionando Itens ao Carrinho3Conjuntos
O que é um Conjunto?Criando um ConjuntoAdicionando e Removendo de ConjuntosVerificando Elementos em um ConjuntoConvertendo uma Lista para um ConjuntoUnião de ConjuntosInterseção de ConjuntosDiferença de ConjuntosRecapitulação - Lista de Convidados Únicos