Fonction récursive : Compte à rebours
Fait partie de la section Logique & Flux du Journey Dart de Coddy — leçon 48 sur 65.
Il est maintenant temps de mettre la récursion en pratique avec une fonction de compte à rebours simple. Cet exercice vous aidera à comprendre comment le cas de base et l'étape récursive fonctionnent ensemble dans du code réel.
Une fonction de compte à rebours commence par un nombre et affiche chaque nombre jusqu'à zéro. Voici comment la récursivité permet d'y parvenir : si le nombre est supérieur à zéro, affichez-le, puis appelez la même fonction avec un nombre plus petit. Lorsque le nombre atteint zéro, arrêtez-vous.
void countdown(int number) {
if (number <= 0) {
print("Done!");
return; // Cas de base - s'arrêter ici
}
print(number);
countdown(number - 1); // Étape récursive
}Le cas de base vérifie si number <= 0 - c'est à ce moment que nous arrêtons d'appeler la fonction. L'étape récursive appelle countdown(number - 1), ce qui est le même problème mais avec une entrée plus petite, nous rapprochant progressivement du cas de base.
Lorsque vous appelez countdown(3), il affiche 3, puis appelle countdown(2), qui affiche 2, puis appelle countdown(1), qui affiche 1, puis appelle countdown(0), qui affiche "Done!" et s'arrête.
Défi
FacileCréez un programme qui implémente un compte à rebours récursif avec des messages personnalisés. Votre programme démontrera la récursion en décomptant à partir d'un nombre donné et en affichant des messages personnalisés à chaque étape.
- Lisez une entrée de type chaîne de caractères représentant le nombre de départ pour le compte à rebours
- Lisez une entrée de type chaîne de caractères représentant un préfixe de message personnalisé (par exemple,
"Launch in","Timer", ou"Countdown") - Convertissez la première entrée en un entier en utilisant
int.parse() - Créez une fonction récursive appelée
customCountdownqui prend deux paramètres : - Un entier
numberreprésentant la valeur actuelle du compte à rebours - Une chaîne de caractères
messagePrefixpour le message personnalisé - La fonction doit implémenter la logique suivante :
- Cas de base : Si le nombre est inférieur ou égal à 0, affichez
"Countdown complete!"et quittez la fonction - Étape récursive : Affichez le préfixe du message suivi du nombre actuel, puis appelez-vous elle-même avec
number - 1 - Appelez la fonction
customCountdownavec le nombre converti et le préfixe du message - Affichez les résultats exactement selon le format illustré ci-dessous
Par exemple, si les entrées sont "5" et "Launch in", votre programme doit afficher :
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 les entrées sont "3" et "Timer", votre programme doit afficher :
Starting countdown from: 3
Message prefix: Timer
========================
Timer 3
Timer 2
Timer 1
Countdown complete!Si les entrées sont "0" et "Ready", votre programme doit afficher :
Starting countdown from: 0
Message prefix: Ready
========================
Countdown complete!Votre programme doit implémenter la fonction récursive customCountdown qui s'appelle elle-même avec un nombre décrémenté jusqu'à ce qu'elle atteigne le cas de base. La fonction doit afficher le message personnalisé avec le nombre actuel à chaque appel récursif, démontrant ainsi comment la récursion décompose le problème en sous-problèmes identiques plus petits. Utilisez l'interpolation de chaîne pour formater les messages du compte à rebours comme "$messagePrefix $number".
Aide-mémoire
Une fonction de compte à rebours récursive démontre le fonctionnement de la récursion en comptant à rebours d'un nombre jusqu'à zéro :
void countdown(int number) {
if (number <= 0) {
print("Done!");
return; // Cas de base - s'arrêter ici
}
print(number);
countdown(number - 1); // Étape récursive
}Le cas de base vérifie si number <= 0 pour arrêter la récursion. L'étape récursive appelle la même fonction avec number - 1, se rapprochant ainsi du cas de base.
Lors de l'appel de countdown(3), il affiche 3 → 2 → 1 → "Done!" en effectuant des appels récursifs successifs avec des valeurs décrémentées.
Essayez vous-même
import 'dart:io';
// TODO: Créez votre fonction customCountdown ici
// N'oubliez pas de gérer le cas de base (nombre <= 0) et l'étape récursive
void main() {
// Lire l'entrée
String? startingNumber = stdin.readLineSync();
String? messagePrefix = stdin.readLineSync();
// Convertir la chaîne en entier
int number = int.parse(startingNumber!);
// Afficher les informations initiales
print('Starting countdown from: $number');
print('Message prefix: $messagePrefix');
print('========================');
// TODO: Appelez votre fonction customCountdown ici
// N'oubliez pas de gérer la sécurité null pour messagePrefix
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique & Flux
1Manipulation avancée des listes
Propriétés de liste : first & lastÉtat de la liste : isEmpty & isNotEmptyInverser une listeAjouter à une liste : insertSuppression dans une liste : removeWhereRechercher dans une liste : indexOfTrier une listeMélanger une listeRécapitulatif - Organisateur de liste4Manipulation avancée des Maps
Itérer sur une MapVérifier les clés et les valeursPropriétés de Map : keys & valuesAjout conditionnel : putIfAbsentSupprimer des entrées d'une MapMaps imbriquéesRécapitulatif - Mise à jour de l'inventaire7Fonctions avancées
Fonctions anonymesPassage de fonctions en argumentsComprendre les closuresIntroduction à la récursivitéFonction récursive : Compte à reboursFonction récursive : FactorielleRécapitulatif - List Processor2Opérations fonctionnelles sur les listes
Transformer avec 'map'Filtrer avec 'where'Utiliser '.toList()'Vérifier des conditions avec 'any'Conditions avec 'every'Trouver avec 'firstWhere'Récapitulatif - Filtrage de données3Les Ensembles
Qu'est-ce qu'un ensemble ?Créer un ensembleAjouter et supprimer des éléments d'un ensembleVérifier la présence d'éléments dans un ensembleConvertir une liste en ensembleUnion d'ensemblesIntersection d'ensemblesDifférence d'ensemblesRécapitulatif - Liste d'invités uniques