La ricorsione è il processo di definizione di un problema (o la soluzione di un problema) in termini di (una versione più semplice di) stesso.
Ad esempio, possiamo definire l’operazione “find your way home” come:
-
Se sei a casa, smetti di muoverti.
-
Fai un passo verso casa.
-
“trova la strada di casa”.
Qui la soluzione per trovare la strada di casa è di due passi (tre passi). Primo, non andiamo a casa se siamo già a casa., In secondo luogo, facciamo un’azione molto semplice che rende la nostra situazione più semplice da risolvere. Infine, rifacciamo l’intero algoritmo.
L’esempio precedente è chiamato ricorsione della coda. Questo è dove l’ultima istruzione sta chiamando l’algoritmo ricorsivo. La ricorsione della coda può essere tradotta direttamente in loop.
Come scriveresti un “algoritmo” ricorsivo per trovare il Quadrato del Tempio?
Un altro esempio di ricorsione sarebbe trovare il valore massimo in un elenco di numeri. Il valore massimo in un elenco è il primo numero o il più grande dei numeri rimanenti., Ecco come possiamo scrivere lo pseudocodice dell’algoritmo:
Componenti di un Algoritmo Ricorsivo
per Tutti gli algoritmi ricorsivi, è necessario che:
-
Base (cioè, quando fermarsi)
-
Lavorare verso di Base
-
Chiamata Ricorsiva (cioè, chiamiamo)
“Il lavoro verso la base, dove abbiamo un problema più semplice (ad esempio, dividere la lista in due parti, ogni più piccolo rispetto all’originale). La chiamata ricorsiva, è dove usiamo lo stesso algoritmo per risolvere una versione più semplice del problema., Il caso base è la soluzione al problema” più semplice “possibile (ad esempio, il caso base nel problema” trova il numero più grande in una lista ” sarebbe se la lista avesse un solo numero… e per definizione se c’è solo un numero, è il più grande).
Esempio semplice: Aggiungere tre numeri
Aggiungere tre numeri equivale ad aggiungere i primi due numeri, quindi aggiungere di nuovo questi due numeri.
(Nota, in Matlab, una funzione può essere chiamata senza tutti gli argomenti. La funzione nargin indica al computer quanti valori sono stati specificati., Quindi add_numbers(1) avrebbe un nargin di 1; add_numbers(1,1) avrebbe un nargin di 2; add_numbers(1,1,1) avrebbe un nargin di 3.)
Identifica le 3 parti dell’algoritmo ricorsivo:
Tutto l’algoritmo ricorsivo deve avere le seguenti tre fasi:
Perché la ricorsione funziona
In un algoritmo ricorsivo, il computer “ricorda” ogni stato precedente del problema. Queste informazioni sono ” detenute “dal computer nello” stack di attivazione ” (cioè all’interno di ogni area di lavoro delle funzioni).
Ogni funzione ha il proprio spazio di lavoro PER OGNI CHIAMATA della funzione.,
Esempio di labirinto:
Considera una griglia rettangolare di stanze, in cui ogni stanza può avere o meno porte sui lati Nord, Sud, Est e Ovest.
Come si fa a trovare la via d’uscita da un labirinto? Ecco un possibile “algoritmo” per trovare la risposta:
Per ogni porta nella stanza corrente, se la porta conduce all’uscita, prendi quella porta.
Il” trucco ” qui è ovviamente, come facciamo a sapere se la porta conduce a una stanza che conduce all’uscita? La risposta è che non lo facciamo, ma possiamo lasciare che il computer lo capisca per noi.
Qual è la parte ricorsiva dell’algoritmo di cui sopra?, La sua “porta conduce fuori dal labirinto”. Come facciamo a sapere se una porta conduce fuori dal labirinto? Sappiamo perché all’interno della stanza accanto (passando attraverso la porta), facciamo la stessa domanda, come usciamo dal labirinto?
Quello che succede è che il computer “ricorda” tutti i “what ifs”. Cosa succede se prendo la prima porta, cosa succede se prendo la seconda porta, cosa succede se prendo la porta accanto, ecc. E per ogni possibile porta che puoi attraversare, il computer ricorda quelli che se, e per ogni porta dopo, e dopo, ecc., fino alla fine.
Ecco una stretta implementazione del codice reale.,
Domanda: qual è il caso base sopra?
Risposta: (Quella era una domanda trabocchetto) Non c’è un caso base nel codice. È necessario controllare all’inizio se la stanza è l’uscita. Se lo è, nessuna ricorsione!
function success = find_way_out( maze, room ) if room is exit → return true room ← mark as visited % rest of code ... end
Domanda: Come contrassegnare la stanza come visitata?
Risposta: Ci sono varie tecniche. Se la stanza è una struttura (o un oggetto) è possibile aggiungere la direzione del campo visitato alla stanza. (ad esempio, camera.visited = true;) Se non si utilizzano oggetti, è possibile avere una matrice di flag booleani che è la stessa dimensione / forma del labirinto e utilizzare questi valori.,
Domanda: sono gli altri problemi con l’algoritmo di cui sopra?
Risposta: La risposta può essere trovata pensando alla seguente domanda: Cosa accadrebbe se il labirinto fosse una griglia gigante di stanze rettangolari di dimensioni identiche, ognuna con porte su ogni parete? Immagina di andare a nord attraverso la prima porta, poi a est attraverso la porta delle stanze accanto, poi a sud attraverso quella porta delle stanze, e poi a ovest attraverso quella porta delle stanze. Dove finisci? Torna dove hai iniziato! Peggio ancora, potresti continuare a fare questo ciclo per sempre. Come risolverebbe questo problema un intrepido avventuriero?,
Una risposta a questo è usando un pezzo di gesso e mettendo una grande X sul pavimento di ogni stanza che entri. Quindi quando torni in una stanza con una X sul pavimento, sai che non devi entrare. Nel caso del programma, dovrebbe essere usato un flag booleano “visto” o “visitato”. Ogni camera ha una bandiera. Ogni stanza inizia con il flag impostato su false. Quando si visita una stanza, si imposta la bandiera su true., Infine, nel “caso base”hai una riga come:
function success = find_way_out( maze, room ) % exit chack if room is visited → return false % rest of code ... end
La ricorsione può essere ugualmente applicata agli algoritmi del computer:
Alcuni esempi relativi al computer includono: Aggiunta di un elenco di numeri, Calcolo della sequenza di Fibonacci, calcolo di un fattoriale e Sudoku.
Loop e ricorsione della coda
Alcuni algoritmi ricorsivi sono molto simili ai loop. Questi algoritmi sono chiamati ” coda ricorsiva “perché l’ultima istruzione nell’algoritmo è” riavviare ” l’algoritmo. Gli algoritmi ricorsivi della coda possono essere tradotti direttamente in loop.
Lascia un commento