<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Andrea Privitera - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Impara a programmare gratuitamente! Tutorial di programmazione su Python, JavaScript, Linux e molto altro. ]]>
        </description>
        <link>https://www.freecodecamp.org/italian/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Andrea Privitera - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/italian/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Fri, 03 Jul 2026 19:43:18 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/italian/news/author/andrea-privitera/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Che Cos'è la Ricorsione? Funzioni Ricorsive in JavaScript Spiegate con Esempi di Codice ]]>
                </title>
                <description>
                    <![CDATA[ La ricorsione è una tecnica usata per risolvere problemi computazionali attraverso una funzione che invoca sé stessa fino a quando il programma ottiene il risultato desiderato. Questo tutorial ti consentirà di imparare cos'è ricorsione e quali sono le differenze rispetto ai più comuni loop. Che cos'è la ricorsione? Prendiamo come ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/che-cose-la-ricorsione-funzioni-ricorsive-in-javascript-spiegate-con-esempi-di-codice/</link>
                <guid isPermaLink="false">661b3a1daedb4204c0d38dc6</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrea Privitera ]]>
                </dc:creator>
                <pubDate>Mon, 15 Apr 2024 08:23:18 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2024/04/recursion-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/what-is-recursion-in-javascript/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">What is Recursion? A Recursive Function Explained with JavaScript Code Examples</a>
      </p><p>La ricorsione è una tecnica usata per risolvere problemi computazionali attraverso una funzione che invoca sé stessa fino a quando il programma ottiene il risultato desiderato.</p><p>Questo tutorial ti consentirà di imparare cos'è ricorsione e quali sono le differenze rispetto ai più comuni loop.</p><h2 id="che-cos-la-ricorsione"><strong>Che cos'è la ricorsione?</strong></h2><p>Prendiamo come esempio una funzione che mostra nella console i numeri da 1 a 5. Ecco come possiamo scriverla usando la ricorsione:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">function log(num){
    if(num &gt; 5){
        return;
    }
    console.log(num);
    log(num + 1);
}

log(1);</code></pre><figcaption>Esempio di una funzione ricorsiva</figcaption></figure><p>Quando questo codice è eseguito, la funzione <code>log</code> continua a invocare sé stessa fino a quando il valore della variabile <code>num</code> è minore di <code>5</code>.</p><p>Una funzione ricorsiva deve avere almeno una condizione che porti la funzione a smettere di invocarsi. Se la funzione continua a invocarsi, a un certo punto JavaScript darà errore.</p><p>La condizione che consente alla funzione ricorsiva di smettere di invocare sé stessa si chiama <strong>caso base</strong>. Nella funzione <code>log</code> sopra, il caso<em> </em>base e quando <code>num</code> è maggiore di <code>5</code>.</p><h2 id="perch-non-usare-un-ciclo"><strong>Perché non usare un ciclo?</strong></h2><p>Qualsiasi problema che possiamo risolvere con una funzione ricorsiva può sempre essere risolto con una soluzione iterativa. L'esempio precedente può essere sostituito con questo codice:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">for(let i = 1; i &lt;= 5; i++){
    console.log(i);
}</code></pre><figcaption>Un ciclo for come alternativa alla funzione ricorsiva</figcaption></figure><p>I linguaggi di programmazione moderni come JavaScript possiedono istruzioni come <code>for</code> e <code>while</code> che forniscono alternative alle funzioni ricorsive. Tuttavia, esistono linguaggi come Clojure che non includono dichiarazioni di cicli, quindi in questi casi abbiamo bisogno di usare la ricorsione per ripetere parti del codice.</p><p>Inoltre, per usare un ciclo <code>for</code> è necessario sapere quante volte il codice dovrà essere ripetuto. Le funzioni ricorsive e il ciclo <code>while</code> invece possono essere usate per eseguire una parte di codice senza sapere quante volte sarà necessario ripeterlo. L'unica cosa che basta sapere è la condizione che fermerà l'esecuzione del codice.</p><p>Per esempio, immagina di dover risolvere questo problema:</p><ul><li>Scegli un numero a caso tra 1 e 10 fino a quando ottieni 5.</li><li>Registra quante volte il codice è stato eseguito prima di ottenere 5.</li></ul><p>Ecco la soluzione usando una funzione ricorsiva:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">function randomUntilFive(result = 0, count = 0){
    if(result === 5){
        console.log(`Il risultato casuale: ${result}`);
        console.log(`Numero di esecuzioni del codice: ${count}`);
        return;
    }
    result = Math.floor(Math.random() * (10 - 1 + 1) + 1);
    count++;
    randomUntilFive(result, count);
}

randomUntilFive();</code></pre><figcaption>Funzione ricorsiva che sceglie casualmente un numero fino a quando il risultato è 5</figcaption></figure><p>Non è possible sostituire il codice qui sopra con un ciclo <code>for</code>, ma è possibile farlo con un ciclo <code>while</code>:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">let result = 0;
let count = 0;

while (result !== 5) {
  result = Math.floor(Math.random() * (10 - 1 + 1) + 1);
  count++;
}

console.log(`Il risultato casuale: ${result}`);
console.log(`Numero di esecuzioni del codice: ${count}`);</code></pre><figcaption>Alterativa alla funzione ricorsiva con un ciclo while</figcaption></figure><p>Ad esclusione dei colloqui di lavoro in cui ti può essere chiesto di risolvere un problema usando la ricorsione, puoi sempre trovare una soluzione alternativa che usa i cicli <code>for</code> o <code>while</code>.</p><h2 id="come-leggere-una-funzione-ricorsiva"><strong>Come leggere una funzione ricorsiva</strong></h2><p>Una funzione ricorsiva non è facile o intuitiva da capire a prima vista. I seguenti punti ti aiuteranno a leggere e capire una funzione ricorsiva velocemente.</p><ol><li>Prima di tutto, identifica sempre qual è il <strong>caso base</strong><em>;</em></li><li>Passa argomenti nella funzione che raggiungono immediatamente il caso base;</li><li>Includi argomenti che consentiranno almeno una iterazione della funzione ricorsiva.</li></ol><p>Proviamo a seguire questi passaggi usando l'esempio precedente di <code>randomUntilFive()</code>. Puoi identificare il caso base per questa funzione all'interno dell'istruzione <code>if</code>:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">function randomUntilFive(result = 0, count = 0){
    if(result === 5){
        // il caso base è attivato
    }
    // la funzione è invocata ricorsivamente
}

randomUntilFive();</code></pre><figcaption>Identificare il caso base della funzione</figcaption></figure><p>Questo significa che puoi raggiungere il caso base passando il numero <code>5</code> nel parametro <code>result</code> come segue:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">function randomUntilFive(result = 0, count = 0){
    if(result === 5){
        console.log(`Il risultato casuale: ${result}`);
        console.log(`Numero di esecuzioni del codice: ${count}`);
        return;
    }
}

randomUntilFive(5);</code></pre><figcaption>Raggiungere il caso base di una funzione ricorsiva</figcaption></figure><p>Il parametro <code>count</code> non dovrebbe essere zero. Tuttavia, se passiamo il numero <code>5</code> come argomento della funzione sopra allora soddisfiamo il requisito del punto 2.</p><p>Infine, dobbiamo trovare un argomento che ci consenta di eseguire la funzione ricorsiva una volta. Nel caso qui sopra, possiamo passare qualsiasi numero tranne <code>5</code>, oppure possiamo anche non passare alcun argomento:</p><pre><code class="language-js">function randomUntilFive(result = 0, count = 0){
    if(result === 5){
        console.log(`Il risultato casuale: ${result}`);
        console.log(`Numero di esecuzioni del codice: ${count}`);
        return;
    }
    result = Math.floor(Math.random() * (10 - 1 + 1) + 1);
    count++;
    randomUntilFive(result, count);
}

randomUntilFive(4); 
// qualsiasi numero diverso da 5
// eseguirà la ricorsione</code></pre><p>Ecco fatto. Ora abbiamo capito che la funzione <code>randomUntilFive()</code> invocherà sé stessa ricorsivamente fino a quando il valore di <code>result</code> non sarà <code>5</code>.</p><h2 id="come-scrivere-una-funzione-ricorsiva"><strong>Come scrivere una funzione ricorsiva</strong></h2><p>Scrivere una funzione ricorsiva non è molto diverso da leggerne una.</p><ol><li>Crea una funzione regolare con un caso base che può essere raggiunto con i suoi parametri;</li><li>Passa argomenti nella funzione che attivano immediatamente il caso base;</li><li>Passa argomenti che attivano la ricorsione una volta sola.</li></ol><p>Prendiamo l'esempio di una funzione per il calcolo di <a href="https://it.wikipedia.org/wiki/Fattoriale">fattoriali</a>. Ecco il fattoriale di cinque:</p><p><strong><strong>5*4*3*2*1 = 120</strong></strong></p><p>Il caso base di questa funzione è uno, quindi creiamo una funzione <code>factorial</code> che restituisce uno:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">function factorial(num){
    if(num === 1){
        return num;
    }
    
}

console.log(factorial(1));</code></pre><figcaption>Il caso base per la funzione <code>factorial</code></figcaption></figure><p>Ora, andiamo al passo 3. Abbiamo bisogno di raggiungere la chiamata ricorsiva nella funzione e invocarla almeno una volta. Visto che il calcolo fattoriale diminuisce il numero di uno ad ogni moltiplicazione, possiamo simulare questo caso passando l'argomento <code>num-1</code> nella chiamata ricorsiva:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">function factorial(num){
    if(num === 1){
        return num;
    }
    return num * factorial(num-1) 
}

console.log(factorial(2));</code></pre><figcaption>La ricorsione di <code>factorial</code></figcaption></figure><p>Abbiamo finito. Puoi testare la funzione passando 5 come argomento:</p><figure class="kg-card kg-code-card"><pre><code class="language-js">console.log(factorial(5));</code></pre><figcaption>Test della funzione <code>factorial</code></figcaption></figure><h2 id="conclusione"><strong>Conclusione</strong></h2><p>Abbiamo imparato che cos'è una funzione ricorsiva e quali sono le differenze tra questo tipo di funzione e le comuni istruzioni di ciclo <code>for</code> e <code>while</code>. Una funzione ricorsiva deve sempre avere almeno un caso base affinché eviti di invocare sé stessa all'infinito. In caso contrario, la funzione darà un errore.</p><p>Quando leggiamo una funzione ricorsiva, dobbiamo simulare una situazione dove il caso base è eseguito immediatamente senza eseguire la chiamata ricorsiva.</p><p>Quando abbiamo trovato il caso base, facciamo un passo indietro e proviamo a eseguire la chiamata ricorsiva almeno una volta. In questo modo, la tua mente percorrerà il codice ricorsivo e capirà intuitivamente come funziona.</p><p>Lo stesso vale per quando dobbiamo scrivere una funzione ricorsiva. È bene pensare sempre al caso base all'inizio, e poi includere un argomento nella funzione che faccia eseguire la chiamata ricorsiva almeno una volta. Dopo aver fatto questo, tutto il resto sarà facile.</p><h2 id="grazie-per-aver-letto-questo-tutorial"><strong>Grazie per aver letto questo tutorial</strong></h2><p>Se questo articolo ti è piaciuto e vuoi migliorare le tue abilità in JavaScript, ti consiglio di leggere il mio nuovo libro <em><em>Beginning Modern JavaScript</em></em> <a href="https://www.amazon.com/dp/B0CQXHMF8G">qui</a>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2024/01/beginning-js-cover.png" class="kg-image" alt="beginning-js-cover" width="600" height="400" loading="lazy"></figure><p>Questo libro è pensato per essere facile da capire e accessibile per chiunque voglia imparare JavaScript. Le sue semplici guide passo-passo ti aiuteranno a capire come usare JavaScript per creare un'applicazione dinamica.</p><p>Ti prometto che <em>capirai davvero cosa stai facendo con JavaScript.</em></p><p>Alla prossima!</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
