Funzione ricorsiva: conto alla rovescia
Fa parte della sezione Logica e flusso del percorso Dart di Coddy. Lezione 48 di 65.
Ora è il momento di mettere in pratica la ricorsione con una semplice funzione di conto alla rovescia. Questo esercizio ti aiuterà a capire come il caso base e il passaggio ricorsivo lavorano insieme nel codice reale.
Una funzione di conto alla rovescia parte da un numero e stampa ogni numero fino a zero. Ecco come la ricorsione permette di farlo: se il numero è maggiore di zero, stampalo e poi richiama la stessa funzione con un numero più piccolo. Quando il numero raggiunge zero, fermati.
void countdown(int number) {
if (number <= 0) {
print("Done!");
return; // Caso base - fermati qui
}
print(number);
countdown(number - 1); // Passo ricorsivo
}Il caso base verifica se number <= 0 - è in questo momento che smettiamo di chiamare la funzione. Il passaggio ricorsivo chiama countdown(number - 1), che è lo stesso problema ma con un input più piccolo, avvicinandoci gradualmente al caso base.
Quando chiami countdown(3), stampa 3, poi chiama countdown(2), che stampa 2, poi chiama countdown(1), che stampa 1, poi chiama countdown(0), che stampa "Done!" e si ferma.
Sfida
FacileCrea un programma che implementi un timer per il conto alla rovescia ricorsivo con messaggi personalizzati. Il programma mostrerà la ricorsione contando alla rovescia a partire da un numero specificato e visualizzando messaggi personalizzati a ogni passaggio.
- Leggi un input di tipo stringa che rappresenta il numero iniziale del conto alla rovescia
- Leggi un input di tipo stringa che rappresenta un prefisso personalizzato per il messaggio (ad es.,
"Launch in","Timer"o"Countdown") - Converti il primo input in un intero usando
int.parse() - Crea una funzione ricorsiva chiamata
customCountdownche accetta due parametri: - Un intero
numberche rappresenta il valore corrente del conto alla rovescia - Una stringa
messagePrefixper il messaggio personalizzato - La funzione deve implementare la seguente logica:
- Caso base: se il numero è minore o uguale a 0, stampa
"Countdown complete!"e return - Passaggio ricorsivo: stampa il prefisso del messaggio seguito dal numero corrente, quindi richiama la funzione con
number - 1 - Chiama la funzione
customCountdowncon il numero convertito e il prefisso del messaggio - Visualizza i risultati esattamente nel formato mostrato qui sotto
Ad esempio, se gli input sono "5" e "Launch in", il programma deve produrre:
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 gli input sono "3" e "Timer", il programma deve produrre:
Starting countdown from: 3
Message prefix: Timer
========================
Timer 3
Timer 2
Timer 1
Countdown complete!Se gli input sono "0" e "Ready", il programma deve produrre:
Starting countdown from: 0
Message prefix: Ready
========================
Countdown complete!Il programma deve implementare la funzione ricorsiva customCountdown, che richiama sé stessa con un numero decrementato fino a raggiungere il caso base. A ogni chiamata ricorsiva, la funzione deve stampare il messaggio personalizzato con il numero corrente, mostrando come la ricorsione scompone il problema in sottoproblemi identici e più piccoli. Usa l’interpolazione di stringhe per formattare i messaggi del conto alla rovescia come "$messagePrefix $number".
Provalo tu
import 'dart:io';
// TODO: Crea qui la tua funzione customCountdown
// Ricorda di gestire il caso base (number <= 0) e il passo ricorsivo
void main() {
// Leggi l'input
String? startingNumber = stdin.readLineSync();
String? messagePrefix = stdin.readLineSync();
// Converti la stringa in un numero intero
int number = int.parse(startingNumber!);
// Mostra le informazioni iniziali
print('Starting countdown from: $number');
print('Message prefix: $messagePrefix');
print('========================');
// TODO: Chiama qui la tua funzione customCountdown
// Ricorda di gestire la sicurezza rispetto ai valori null per messagePrefix
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Manipolazione avanzata delle liste
Proprietà delle liste: primo e ultimoStato della lista: isEmpty e isNotEmpInvertire una listaAggiungere a una lista: insertRimozione dalla lista: removeWhereRicerca in una lista: indexOfOrdinare una listaMescolare una listaRiepilogo - Organizzatore di liste4Manipolazione avanzata delle mappe
Iterare su una mappaVerificare chiavi e valoriProprietà delle mappe: chiavi e valoriAggiunta condizionale: putIfAbsentRimuovere elementi da una mappaMappe annidateRiepilogo - Aggiornamento dell'inventario7Funzioni avanzate
Funzioni anonimePassare funzioni come argomentiComprendere le closureIntroduzione alla ricorsioneFunzione ricorsiva: conto alla rovesciaFunzione ricorsiva: fattorialeRipasso - elaboratore di liste2Operazioni funzionali sulle liste
Trasformare con 'map'Filtrare con 'where'Usare '.toList()'Verificare condizioni con 'any'Condizioni con 'every'Trovare con 'firstWhere'Riepilogo - Filtraggio dei dati3Insiemi
Che cos'è un insieme?Creare un insiemeAggiungere e rimuovere elementi dagli insiemiVerificare la presenza di elementi in un insiemeConvertire una lista in un insiemeUnione di insiemiIntersezione di insiemiDifferenza tra insiemiRiepilogo - Lista degli ospiti uniciEsercitati da solo: Compilatore Dart online