RICORSIONE FATTORIALE

di il
3 risposte

RICORSIONE FATTORIALE

def fattoriale(n): # <------------------     3,               2,          1
    if n < 2:  
        return 1 # <------------------     salta,           salta,        1
    else:
        return n * fattoriale(n - 1) # 3*fattoriale(2), 2*fattoriale(1), 2*1

print(fattoriale(3))
  • passo 3 alla funzione fattoriale
  • salta la prima istruzione if e passa all'else
  • esegue fattoriale di 2
  • salta l'if passa all'else
  • esegue fattoriale di 1
  • restituisce 1 alla chiamata fattoriale di 2
COME FA A CALCOLARE 3*2*1 SE LA FUNZIONE fattoriale NON RESTITUISCE MAI
2 ALLA CHIAMATA MA SOLAMENTE 1 TRAMITE IL CASO BASE ? INOLTRE DA QUEL CHE
HO CAPITO LA VARIABILE n CAMBIA OGNI QUAL VOLTA VIENE CHIAMATA LA FUNZIONE
fattoriale DIVENENDO 3, 2, 1 NON DOVREBBE QUINDI ESEGUIRE 3*2 E POI 2*1 ?

qualcuno potrebbe darmi una spiegazione esaustiva e dettagliata della funzione ricorsiva in questione?

__

3 Risposte

  • Re: RICORSIONE FATTORIALE

    Salve,

    Inizierei introducendo il concetto del calcolo di un numero fattoriale:
    Un numero fattoriale è il risultato della moltiplicazione di tutti i numeri naturali che lo precedono, comprendendo il numero stesso ed escludendo lo zero.

    Ora, il modo più semplice, come probabilmente già sai, è quello di usare la cosiddetta Ricorsione; in ambito informatico la un algoritmo ricorsivo è una "chiamata" (o riferimento) all'algoritmo stesso con l'aggiunta di dati semplici, usati per elaborare un eventuale risultato.
    In parole povere: un algoritmo che richiama se stesso.


    I due esempi più classici sono la funzione Fibonacci e il Fattoriale, come nel tuo caso.

    Proverò a spiegarti nella maniera più esaustiva possibile il calcolo del fattoriale:
    Step 1:
    Alla prima chiamata della funzione abbiamo la variabile n inizializzata a 3 (per esempio);
    3 è indiscutibilmente maggiore di 2, per tanto eseguirà l'else, quindi andrà a restituire una moltiplicazione che ha come fattori il 3 e il fattoriale di 2.
    Uno schema grafico sarebbe:
    Risultato = fattoriale(3)
    		|_ 3 * fattoriale(2)
    Step 2:
    Alla seconda chiamata (fatta dalla funzione stessa, eseguita allo step 1), avremo la variabile n inizializzata a "n-1", ovvero 2;
    2 non è minore di 2, quindi va eseguito anche in questo step l'else, che restituirà la moltiplicazione tra 2 e fattoriale di 1.
    Lo schema ora sarebbe:
    Risultato = fattoriale(3)
    		|_ 3 * fattoriale(3-1)
    			|_ 2 * fattoriale(2-1)
    Step 3:
    A questo punto, alla terza chiamata, abbiamo la nostra n inizializzata ad "n-1", quindi 1;
    1 è minore di 2, dunque, andremo ad eseguire l'if, che restituirà semplicemente 1.
    A questo punto lo schema finale sarebbe:
    Risultato = fattoriale(3)
    		|_ 3 * fattoriale(3-1) #2
    			|_ 2 * fattoriale(2-1) #1
    				|_ 1
    Solo adesso, dopo essere arrivato alla fine dello schema, il programma inizierà a calcolare il risultato finale, partendo dal basso:

    Step 4:
    Risultato = fattoriale(3)
    		|_ 3 * fattoriale(3-1) #2
    			|_ 2 * 1
    Step 5:
    Risultato = fattoriale(3)
    		|_ 3 * 2
    Step 6:
    Risultato = 6

    ### FINE ###
  • Re: RICORSIONE FATTORIALE

    Sei bravissimo porca miseria ti giuro hai spiegato proprio BENE veramente tanti complimenti sei riuscito a farmi capire la ricorsione certo è in ogni caso un argomento abbastanza complesso per me però già aver capito su per giù come funziona non è da poco ora tocca vedere se riesco a svolgere gli esercizi che mi hanno assegnato sinceramente me l'avevano già spiegata altri 2 ragazzi ma MAI come l'hai fatto tu proprio BRAVO questa spiegazione me la metto in un repo privato su github per quanto è fatta bene giuro grazie davvero tanto per il tuo aiuto ?
  • Re: RICORSIONE FATTORIALE

    Grazie mille, sono lieto di esserti stato utile.
    Ovviamente se dovessi avere altri problemi con eventuali altri esercizi, il forum è sempre disponibile.

    Buona programmazione.
Devi accedere o registrarti per scrivere nel forum
3 risposte