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 simples de contagem regressiva. Este exercício ajudará você a entender como o caso base e a etapa recursiva trabalham 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 depois 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. A etapa recursiva chama countdown(number - 1), que é o mesmo problema, mas com uma entrada menor, levando-nos gradualmente em direção ao caso base.
Quando você chama countdown(3), ele imprime 3, depois chama countdown(2), que imprime 2, depois chama countdown(1), que imprime 1, depois 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 fazendo uma contagem regressiva a partir de um número fornecido e exibindo mensagens personalizadas a cada etapa.
- Leia uma entrada de string que represente o número inicial da contagem regressiva
- Leia uma entrada de string que represente um prefixo de mensagem personalizado (por exemplo,
"Launch in","Timer"ou"Countdown") - Converta a primeira entrada em um inteiro usando
int.parse() - Crie uma função recursiva chamada
customCountdownque aceite dois parâmetros: - Um inteiro
numberque represente 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 - Etapa recursiva: imprima o prefixo da mensagem seguido pelo número atual e, em seguida, chame a si mesma com
number - 1 - Chame a função
customCountdowncom o número convertido e o prefixo da mensagem - Exiba os resultados exatamente no formato mostrado abaixo
Por exemplo, se as entradas forem "5" e "Launch in", seu programa deverá produzir:
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 deverá produzir:
Starting countdown from: 3
Message prefix: Timer
========================
Timer 3
Timer 2
Timer 1
Countdown complete!Se as entradas forem "0" e "Ready", seu programa deverá produzir:
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é alcançar o caso-base. A função deve imprimir a mensagem personalizada com o número atual a cada chamada recursiva, demonstrando como a recursão divide o problema em subproblemas menores e idênticos. Use interpolação de strings para formatar as mensagens da contagem regressiva como "$messagePrefix $number".
Experimente você mesmo
import 'dart:io';
// TODO: Crie sua função customCountdown aqui
// Lembre-se de tratar o caso base (number <= 0) e o passo recursivo
void main() {
// Ler a 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
// Remember to handle null safety for 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 ÚnicosPratique por conta própria: Compilador de Dart online