JavaScript Base - Sostituire i cicli usando la ricorsione

Tell us what’s happening:

Descrivi qui il tuo problema in dettaglio.
chi puo spiegarmi meglio questo esercizio fatico a comprendere la logica

Who can explain this exercise better to me, I struggle to understand the logic

Your code so far

function sum(arr, n) {
  // Modifica il codice solo sotto questa riga

  // Modifica il codice solo sopra questa riga
}

Your browser information:

Lo user agent è: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36

Challenge Information:

JavaScript Base - Sostituire i cicli usando la ricorsione

Ciao @redelk721,

in questo esercizio devi creare una funzione ricorsiva che sommi i primi n elementi di un array.

Invece di usare un ciclo for, la funzione deve richiamare se stessa. Questo all’inizio è molto controintuitivo. Come faccio a richiamare una funzione che non ho nemmeno finito di definire?
A javascript non frega nulla se non ho finito di definire la funzione, l’importante è che lo abbia iniziato!

Tutto si regge su tre presupposti fondamentali:

  1. Il caso base: viene tipicamente definito come prima cosa e ritorna un valore. La funzione non si richiama più, perché è il caso in cui siamo arrivati alla fine. In un ciclo for, questo corrisponde a quando la variabile di controllo (solitamente chiamata i) arriva al valore massimo o minimo. In questo esercizio, il caso base corrisponde a n<=0.
  1. L’aggiornamento dei parametri. Quando richiami la funzione dentro se stessa, non puoi lasciare i parametri invariati, altrimenti la ricorsione non arriva mai al caso base e il programma è in loop infinito. I parametri dentro il richiamo devono essere modificati in modo che tutti i richiami successivi li avvicinino al caso base. In questo caso, n verrà diminuito di 1 e l’array arr non conterrà il primo elemento.

  2. Il return e la manipolazione dei dati. La funzione deve fare qualcosa di specifico in base al comando dell’esercizio, quindi tipicamente non puoi richiamarla e basta, ma devi fare qualche operazione utilizzando i parametri per ottenere il risultato che vuoi. Nell’esempio di multiply, il richiamo viene moltiplicato con un elemento dell’array. Questo perché l’esercizio chiede la moltiplicazione. Altri esercizi richiederanno altre operazioni.

Ciò che succede è che la prima funzione richiamata rimane “aperta” (cioè in fase di esecuzione ma non completa) e si richiama con parametri aggiornati. La seconda funzione controlla se siamo al caso base. Se sì, ritorna un valore dentro la prima funzione. La prima funzione usa questo valore per delle operazioni e a quel punto ritorna un valore e si chiude. Se invece non siamo al caso base, la seconda funzione rimane anch’essa aperta e si richiama aggiornando i parametri in modo analogo a prima. La terza funzione controlla se siamo al caso base. Se sì, ritorna un valore all’interno della seconda funzione. La seconda funzione lo usa per calcolare il proprio risultato, lo ritorna nella prima funzione e si chiude anche lei. La prima funzione usa il valore della seconda funzione (ma non della terza, perché ormai è chiusa!) per calcolare il proprio risultato, lo ritorna e si chiude. Se invece nella terza non siamo al caso base, ne viene aperta una quarta, e così via…

In altre parole:

  1. Ogni funzione può stare aperta ad aspettare la conclusione delle proprie “figlie” (non mi viene in mente una parola migliore).
  2. Le funzioni si chiudono al contrario. L’ultima che viene chiamata è la prima a chiudersi. La prima richiamata è l’ultima a chiudersi.
  3. Ci deve essere un caso base che innesca le chiusure a catena.

La ricorsione è un sacco di ginnastica mentale per chi si appresta a studiare programmazione, ma per il computer è più snella e veloce da eseguire rispetto ai cicli e fa risparmiare un sacco di righe di codice. Per quanto difficile, è un argomento fondamentale da capire.

Spero di aver chiarito almeno un po’ i tuoi dubbi.

In bocca al lupo!!

grazie per i tuoi consigli appena ancora sto lavorndo per comprendere meglio la ricorsione credo e sottolineo credo che l’abbia capita, intanto rileggo la tua spiegazione aiutandomi con altre
thanks a lot