Funzione ricorsiva: fattoriale
Fa parte della sezione Logica e flusso del percorso Dart di Coddy. Lezione 49 di 65.
Il fattoriale di un numero è una classica operazione matematica, perfetta per dimostrare la ricorsione. Il fattoriale di un intero positivo n (scritto come n!) è il prodotto di tutti gli interi positivi da 1 a n. Per esempio, 5! = 5 × 4 × 3 × 2 × 1 = 120.
Ciò che rende il fattoriale ideale per la ricorsione è che si scompone naturalmente in problemi più piccoli e identici. Per calcolare 5!, puoi pensarci come 5 × 4!. E 4! è semplicemente 4 × 3!, e così via. Questo schema continua finché non raggiungi 1!, che è uguale a 1.
int factorial(int n) {
if (n <= 1) {
return 1; // Caso base
}
return n * factorial(n - 1); // Passo ricorsivo
}Il caso base interrompe la ricorsione quando n <= 1, restituendo 1. Il passaggio ricorsivo moltiplica il numero corrente per il fattoriale del numero successivo più piccolo. Quando chiami factorial(5), restituisce 5 * factorial(4), che restituisce 5 * 4 * factorial(3), e così via fino a raggiungere il caso base.
Questo approccio dimostra come la ricorsione risolva elegantemente i problemi riducendoli a versioni più semplici dello stesso problema, rendendo i calcoli complessi naturali e intuitivi.
Sfida
FacileCrea un programma che calcoli i fattoriali di più numeri usando la ricorsione. Il tuo programma mostrerà la funzione ricorsiva del fattoriale elaborando un elenco di numeri e calcolandone i fattoriali.
- Leggi una stringa di input contenente numeri separati da virgole (ad es.,
"3,5,0,7") - Suddividi la stringa di input in singoli numeri e converti ciascuno in un intero
- Crea una funzione ricorsiva chiamata
factorialche accetta un parametro interon - La funzione
factorialdeve implementare la seguente logica: - Caso base: Se
nè minore o uguale a 1, restituisci 1 - Passo ricorsivo: Restituisci
nmoltiplicato perfactorial(n - 1) - Per ogni numero nell'elenco di input, calcola il suo fattoriale usando la tua funzione ricorsiva
- Visualizza i risultati mostrando ogni numero e il fattoriale corrispondente
- Calcola e visualizza la somma di tutti i fattoriali ottenuti
Ad esempio, se l'input è "4,3,2", il programma dovrebbe produrre:
Factorial Calculator
====================
Processing numbers: [4, 3, 2]
====================
Factorial Results:
4! = 24
3! = 6
2! = 2
====================
Sum of all factorials: 32
Calculation completed successfullySe l'input è "5,0,1", il programma dovrebbe produrre:
Factorial Calculator
====================
Processing numbers: [5, 0, 1]
====================
Factorial Results:
5! = 120
0! = 1
1! = 1
====================
Sum of all factorials: 122
Calculation completed successfullySe l'input è "6", il programma dovrebbe produrre:
Factorial Calculator
====================
Processing numbers: [6]
====================
Factorial Results:
6! = 720
====================
Sum of all factorials: 720
Calculation completed successfullyIl programma deve implementare la funzione ricorsiva factorial che richiama sé stessa con valori decrementati finché non raggiunge il caso base. La funzione dovrebbe mostrare come la ricorsione scompone il calcolo del fattoriale in sottoproblemi più piccoli e identici. Usa l'interpolazione di stringhe per formattare i risultati dei fattoriali come "$n! = $result". Ricorda che 0! è uguale a 1 per definizione matematica, e il tuo caso base dovrebbe gestirlo correttamente.
Provalo tu
import 'dart:io';
// TODO: Crea qui la tua funzione ricorsiva per il calcolo del fattoriale
void main() {
// Leggi la stringa di input contenente numeri separati da virgole
String? input = stdin.readLineSync();
// Dividi l'input e converti i valori in numeri interi
List<int> numbers = input!.split(',').map((str) => int.parse(str.trim())).toList();
// TODO: Scrivi il codice qui sotto per:
// 1. Elaborare ogni numero usando la tua funzione per il calcolo del fattoriale
// 2. Calcolare la somma di tutti i fattoriali
// 3. Visualizzare i risultati nel formato richiesto
print("Factorial Calculator");
print("====================");
print("Processing numbers: $numbers");
print("====================");
print("Factorial Results:");
// TODO: Calcola e visualizza qui i risultati dei fattoriali
print("====================");
// TODO: Visualizza la somma di tutti i fattoriali
print("Calculation completed successfully");
}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