Sei sulla pagina 1di 4

APA I e II La ricorsione

Definizione

„ procedura ricorsiva:
La ricorsione z all’interno della propria definizione
chiamata alla procedura stessa
(ricorsione diretta)
Paolo Camurati z chiamata ad almeno una procedura la
Dip. Automatica e Informatica quale, direttamente o indirettamente,
Politecnico di Torino chiama la procedura stessa (ricorsione
indiretta)
„ algoritmo ricorsivo: si basa su procedure
ricorsive.
A.A. 2008/09 La ricorsione 2

Motivazioni

„ La soluzione di un problema S applicato ai


dati D è ricorsiva se si può esprimere
come: „ Natura di molti problemi:
S(D) = f(S(D’)) D != D0 z risoluzione di sotto-problemi analoghi

S(D0) = S0 a quello di partenza (ma più piccoli)


D’ più semplice di D z combinazione di soluzioni parziali nella
soluzione del problema originario.
„ Eleganza matematica della soluzione.
condizione di
terminazione
A.A. 2008/09 La ricorsione 3 A.A. 2008/09 La ricorsione 4

Condizione di terminazione Esempi


Fattoriale
n! ≡ n * (n-1)! n≥1
0! ≡ 1
Ogni algoritmo deve terminare ⇒ ricorsione Numeri di Fibonacci:
finita. FIBn+1 = FIBn-1 + FIBn n>0
Sottoproblemi semplici e risolvibili: FIB1 = 1
„ banali (es.: insiemi di 1 solo elemento) FIB0 = 0
„ metodi alternativi alla ricorsione. ratio aurea ϕ = (1 + √5)/2 = 1.61803
ϕ’ = (1 - √5)/2 = -0.61803
FIBn = (ϕn - ϕ’n)/ √5

A.A. 2008/09 La ricorsione 5 A.A. 2008/09 La ricorsione 6

1
APA I e II La ricorsione

Calcolo di 5! Calcolo di FIB5

FIB5
5! = 5 * 4! = 120

4! = 4 * 3! = 24
FIB3 FIB4
3! = 3 * 2! = 6

2! = 2 * 1! = 2 FIB1 FIB2 FIB2 FIB3

1! = 1 * 0! = 1 FIB0 FIB1 FIB0 FIB1 FIB1 FIB2

0! = 1
FIB0 FIB1

A.A. 2008/09 La ricorsione 7 A.A. 2008/09 La ricorsione 8

Esempi di calcolo ricorsivo del gcd


Algoritmo di Euclide per il massimo comun gcd(600,54)
divisore gcd di due interi m e n gcd(54, 6)
„ se m > n, gcd(m, n) = gcd(n, m mod n)
gcd(6, 0) return 6

„ terminazione: se n = 0 ritorna m gcd(314159,271828)


gcd(271828,42331)
Valutazione di espressione prefissa con + e *: gcd(42331,17842)
gcd(17842,6647)
„ se a[i] è un operatore, gcd(6647,4548)
ritorna eval() op eval() gcd(4548,2099)
gcd(2099,350)
„ terminazione: se a[i] è un numero, ritornalo gcd(350,349)
gcd(349,1)
gcd(1,0) return 1
314159 e 271828 sono primi tra di loro
A.A. 2008/09 La ricorsione 9 A.A. 2008/09 La ricorsione 10

Ricerca di una chiave


k 4
Ricerca binaria o dicotomica: la chiave k è v 1 3 4 6 8 9 11 12 y = elemento di mezzo
presente all’interno di un vettore ordinato v[N]? a = indice estremo di SX
Sì/No 1 3 4 6 8 9 11 12 b = indice estremo di DX
Approccio c = indice elemento di mezzo
„ ad ogni passo: confronto k con elemento
1 3 4 6
centrale del vettore: y
z =: terminazione con successo
4 6 y≥x y<x
z <: la ricerca prosegue nel sottovettore di
SX
z >: la ricerca prosegue nel sottovettore di
DX
A.A. 2008/09 La ricorsione 11 A.A. 2008/09 La ricorsione 12

2
APA I e II La ricorsione

Massimo di un vettore di Item:


„ se la dimensione è N=1, trovo il massimo Moltiplicazione di 2 interi x e y di n cifre (con n = 2k):
esplicitamente „ se la dimensione è N=1, calcola x * y
„ per N>1 „ per N>1
„ divido il vettore in due sottovettori metà „ dividi x in 2: x = 10n/2 *xs + xd
„ applico ricorsivamente la ricerca del „ dividi y in 2: y = 10n/2 *ys + yd
massimo a ciascun sottovettore „ calcola ricorsivamente xs*ys, xd*yd, xs*yd, xd*ys
„ confronto i risultati e restituisco il più
„ calcola
grande
x * y = 10n *xs *ys + 10n/2 *(xs*yd + xd*ys) + xd*yd

A.A. 2008/09 La ricorsione 13 A.A. 2008/09 La ricorsione 14

Complessità:
„ moltiplicazione per potenza di 10: shift a
Riduzione del numero di moltiplicazioni:
sinistra (costo unitario) (2 moltiplicazioni) xs*yd + xd*ys = xs*ys + xd*yd – (xs - xd)* (ys - yd)
„ somma di numeri su N cifre: costo lineare in
N (3 somme) 3 moltiplicazioni ricorsive, anziché 4
„ moltiplicazione: costo della ricorsione (4
moltiplicazioni)

A.A. 2008/09 La ricorsione 15 A.A. 2008/09 La ricorsione 16

Dualità ricorsione - iterazione

„ Ogni programma ricorsivo può anche


Elaborazione ricorsiva di liste: essere implementato in modo iterativo.
„ Conta il numero di elementi della lista

„ Attraversa la lista in ordine „ La soluzione migliore (efficienza e


„ Attraversa la lista in ordine inverso chiarezza del codice) dipende dal
problema.
„ Cancella un elemento dalla lista

A.A. 2008/09 La ricorsione 17 A.A. 2008/09 La ricorsione 18

3
APA I e II La ricorsione

Ricerca binaria
Fattoriale:
a c b
5! = 1*2*3*4*5 = 120 v 1 3 4 6 8 9 11 12 k 4
Fibonacci:
a c b
FIB0 = 0 v 1 3 4 6 8 9 11 12 y = elemento di mezzo
FIB1 = 1 c a = indice estremo di SX
a b b = indice estremo di DX
FIB2 = FIB0 + FIB1 = 1 c = indice elemento di mezzo
v 1 3 4 6 8 9 11 12
FIB3 = FIB1 + FIB2 = 2
c
FIB4 = FIB2 + FIB3 = 3 b
a
FIB5 = FIB3 + FIB4 = 5 v 1 3 4 6 8 9 11 12

A.A. 2008/09 La ricorsione 19 A.A. 2008/09 La ricorsione 20

Potrebbero piacerti anche