Menu
Coddy logo textTech

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.

challenge icon

Desafio

Fácil

Crie 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.

  1. Leia uma entrada de string representando o número inicial para a contagem regressiva
  2. Leia uma entrada de string representando um prefixo de mensagem personalizado (ex: "Launch in", "Timer", ou "Countdown")
  3. Converta a primeira entrada para um número inteiro usando int.parse()
  4. Crie uma função recursiva chamada customCountdown que recebe dois parâmetros:
    • Um número inteiro number representando o valor atual da contagem regressiva
    • Uma string messagePrefix para a mensagem personalizada
  5. 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
  6. Chame a função customCountdown com o número convertido e o prefixo da mensagem
  7. 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
}
quiz iconTeste seus conhecimentos

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