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 simple fonction de compte à rebours. Cet exercice t'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écursion permet cela : 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.
void countdown(int number) {
if (number <= 0) {
print("Done!");
return; // Cas de base - arrêter ici
}
print(number);
countdown(number - 1); // Étape récursive
}Le cas de base vérifie si number <= 0 — c’est à ce moment-là que nous cessons d’appeler la fonction. L’étape récursive appelle countdown(number - 1), ce qui constitue le même problème, mais avec une entrée plus petite, nous rapprochant progressivement du cas de base.
Lorsque tu appelles 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écursivité en comptant à rebours à partir d’un nombre donné et en affichant des messages personnalisés à chaque étape.
- Lisez une entrée de type chaîne représentant le nombre de départ du compte à rebours
- Lisez une entrée de type chaîne représentant le préfixe du message personnalisé (par exemple,
"Launch in","Timer"ou"Countdown") - Convertissez la première entrée en entier à l’aide de
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
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 retournez - Étape récursive : Affichez le préfixe du message suivi du nombre actuel, puis appelez la fonction elle-même avec
number - 1 - Appelez la fonction
customCountdownavec le nombre converti et le préfixe du message - Affichez les résultats dans le format exact présenté 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’à atteindre le cas de base. La fonction doit afficher le message personnalisé avec le nombre actuel à chaque appel récursif, démontrant comment la récursivité décompose le problème en sous-problèmes plus petits et identiques. Utilisez l’interpolation de chaînes pour formater les messages du compte à rebours comme "$messagePrefix $number".
Essayez vous-même
import 'dart:io';
// TODO: Créez votre fonction customCountdown ici
// N'oubliez pas de gérer le cas de base (number <= 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
// Remember to handle null safety for 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 uniquesEntraînez-vous par vous-même : Compilateur Dart en ligne