0Pricing
C Academy · Lezione

Ricorsione e iterazione a confronto

Scopra quando scegliere l'una o l'altra.

Ricorsione e iterazione a confronto è una lezione C Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C Academy include 4 lezioni in totale.

Due modi per ripetere

Molti problemi possono essere risolti con la ricorsione o con l'iterazione. L'iterazione usa i cicli; la ricorsione usa le chiamate di funzione.

Entrambe possono produrre lo stesso risultato, ma differiscono per stile, uso della memoria e velocità.

Fattoriale con un ciclo

Ecco il fattoriale scritto in modo iterativo con un ciclo for. Nessuna funzione chiama sé stessa: una sola variabile accumula il prodotto.

#include <stdio.h>

long factorial(int n) {
    long result = 1;
    for (int i = 2; i <= n; i++)
        result *= i;
    return result;
}

int main(void) {
    printf("%ld\n", factorial(6));
    return 0;
}

Fattoriale con la ricorsione

La versione ricorsiva è più breve e rispecchia direttamente la definizione matematica.

Entrambe stampano 720 per factorial(6), ma usano meccanismi diversi.

long factorial(int n) {
    if (n <= 1) return 1;
    return n * factorial(n - 1);
}

Differenze nell'uso della memoria

L'iterazione usa in genere una quantità fissa e ridotta di memoria: solo alcune variabili locali.

La ricorsione aggiunge un record di attivazione per ogni chiamata, quindi una ricorsione profonda usa più memoria e può esaurire lo spazio dello stack.

Differenze di velocità

Ogni chiamata ricorsiva ha un piccolo costo: la configurazione di un record di attivazione e il ritorno da esso.

Per semplici attività di conteggio, i cicli sono spesso leggermente più veloci perché evitano questo overhead delle chiamate.

Quando conviene la ricorsione

La ricorsione è particolarmente efficace quando il problema è naturalmente ricorsivo, come nel caso degli alberi, delle strutture annidate o degli algoritmi divide et impera.

In questi casi, il codice ricorsivo è più breve e chiaro rispetto all'equivalente ciclo con uno stack gestito manualmente.

Quando conviene l'iterazione

Per ripetizioni lineari semplici, come sommare gli elementi di un array o contare, un ciclo è più semplice e usa memoria costante.

Inoltre evita qualsiasi rischio di overflow dello stack con input di grandi dimensioni.

int sum_array(int a[], int n) {
    int total = 0;
    for (int i = 0; i < n; i++)
        total += a[i];
    return total;
}

Stessa attività, entrambi gli stili

La somma da 1 a n può essere calcolata in entrambi i modi. Ecco la versione iterativa, che restituisce lo stesso risultato della ricorsione.

#include <stdio.h>

int sum_to(int n) {
    int total = 0;
    for (int i = 1; i <= n; i++)
        total += i;
    return total;
}

int main(void) {
    printf("%d\n", sum_to(100));
    return 0;
}

Convertire la ricorsione in un ciclo

Qualsiasi ricorsione può essere riscritta come iterazione, talvolta usando uno stack esplicito gestito autonomamente.

La ricorsione lineare semplice, come quella del fattoriale o della somma, si converte in un normale ciclo con una variabile accumulatrice.

#include <stdio.h>

int main(void) {
    int n = 5, result = 1;
    while (n > 1) { result *= n; n--; }
    printf("%d\n", result);
    return 0;
}

Nota sulla ricorsione in coda

Una chiamata ricorsiva in coda è l'ultima operazione eseguita da una funzione. Alcuni compilatori la ottimizzano trasformandola in un ciclo e riutilizzando un solo record di attivazione.

C non lo garantisce, quindi non faccia affidamento su questo comportamento per ricorsioni profonde.

int sum_tail(int n, int acc) {
    if (n == 0) return acc;
    return sum_tail(n - 1, acc + n);
}

Scegliere un approccio

Si chieda: il problema è naturalmente annidato o divide et impera? In tal caso la ricorsione è adatta.

Si tratta invece di una semplice ripetizione lineare con un input potenzialmente enorme? Allora l'iterazione è più sicura e spesso più veloce.

Verifica rapida

Confronti i due approcci.

Riepilogo

La ricorsione e l'iterazione possono risolvere gli stessi problemi. I cicli usano memoria costante e sono ottimi per le attività lineari; la ricorsione è più chiara per i problemi annidati e divide et impera, ma ha il costo di un record di attivazione per ogni chiamata.

Domande Frequenti

La lezione «Ricorsione e iterazione a confronto» è gratuita?

Sì — il testo completo di «Ricorsione e iterazione a confronto» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C Academy, passa a CoddyKit PRO. Il corso C Academy include 4 lezioni in totale.

Cosa imparerò in «Ricorsione e iterazione a confronto»?

Scopra quando scegliere l'una o l'altra. Eserciti C Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C Academy?

Non è richiesta alcuna esperienza precedente. C Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Ricorsione e iterazione a confronto»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C Academy?

Sì. Ogni lezione C Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Come funziona la ricorsione
  2. Problemi ricorsivi classici
  3. Ricorsione e iterazione a confronto
  4. Evitare lo stack overflow
← Torna a C Academy