Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Grassi
Ingegneria Informatica
Fondamenti di informatica
Ricorsione
Ricorsione
n Obiettivi di apprendimento
■ generali
■ introdurre una nuova strategia di soluzione
■ casi di studio
■ conteggio percorsi alternativi
■ ...
2
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
divide et impera
3
n Nascondono i dettagli
■ possiamo quindi ignorarli
4
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
6
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
■ decomposizione “circolare”
■ … funziona ??!?
■ uno dei punti chiave è: avere fiducia …
8
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
>>> downUp("Hello")
Hello
ello
llo
lo
o
lo
llo
ello
Hello
1. Astrazione procedurale
10
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
def downUp1(word):
# @param word : string
assert len(word) == 1
print word
n Ovviamente, funziona:
>>> downUp1("A")
A
11
def downUp2(word):
# @param word : string
assert len(word) == 2
print word
downUp1(word[1:])
print word
>>> downUp2("it")
it
t risultato prodotto dalla chiamata downUp1("t")
it
>>> downUp2("me")
me
e risultato prodotto dalla chiamata downUp1("e")
me
12
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
>>> downUp3("pop")
pop
risultato prodotto op
dalla chiamata p risultato prodotto dalla chiamata downUp2("op")
downUp1("p") op
pop
>>> downUp3("top")
top
op
p
op
top 13
def downUpTest(word):
# @param word : string
print word
downUpTest(word[1:])
print word
14
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
>>> downUpTest("hello")
hello Una funzione è stata chiamata così tante
ello volte che la memoria disponibile per
gestire le varie chiamate viene esaurita.
llo
lo
o
...
RuntimeError: maximum recursion depth exceeded
Please check line …
15
def downUp(word):
# @param word : string
if len(word)==1 :
print word Se c’è un solo carattere nella
else : parola, stampalo e STOP!
print word
downUp(word[1:])
print word
16
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
Ora funziona
>>> downUp("Hello")
Hello
ello
llo
lo
o
lo
llo
ello
Hello
17
Funziona ?
>>> downUp('')
...
RuntimeError: maximum recursion depth exceeded
Please check line …
def downUp(word):
# @param word : string
if len(word)<=1 :
print word
else :
print word
downUp(word[1:])
print word
18
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
Esercizio
>>> upDown("Hello")
Hello
Hell
Hel
He
H
He
Hel
Hell
Hello
19
Altri esempi
T(n)
1
2
• area di T(n) ?
.
. ...
n
1 2 … n – area di T(n) = nx1 + area di T(n-1)
?!?
definizione circolare?
– n! = n x (n - 1)! ?!?
20
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
n fattoriale di n ?
■ se n = 0 ➨ n! = 1
■ se n > 0 ➨ n! = n x (n-1)!
21
Codifica Python
definizione nome e parametri funzione
def areaT(n) : def areaT(n) :
# @param n : int # @param n : int
# @return int # @return int
if n==0 : if n==0 :
“via di fuga” return 0
else : else : chiamata ricorsiva
“ricorsione” return n + areaT(n-1)
23
Dietro le quinte
1. Tracciamento
2. Il metodo dei “piccoli elfi”
24
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
1. Tracciamento
n >>> downUp("Hello")
■ len(word) è maggiore di 1, quindi stampiamo word
n Hello
■ Ora chiamiamo downUp(“ello”) def downUp(word):
■ Ancora più di un carattere, quindi stampiamo # @param word : string
n ello if len(word)<=1 :
■ Ora chiamiamo downUp(“llo”) print word
■ Ancora più di un carattere, quindi stampiamo else :
n llo print word
■ Ora chiamiamo downUp(“lo”) downUp(word[1:])
■ Ancora più di un carattere, quindi stampiamo print word
n lo
■ Ora chiamiamo downUp(“o”)
■ ORA C’E’ UN SOLO CARATTERE! STAMPALO E STOP!
n o
25
Percorso a ritroso
■ downUp(“lo”) ora continua dopo la chiamata a downUp(“o”), perciò stampa
di nuovo e termina.
n lo
■ downUp(“llo”) continua a sua volta (dopo downUp(“lo”))
■ stampa e termina.
n llo
■ downUp(“ello”) continua a sua volta.
■ stampa e termina.
n ello
■ Alla fine, l’ultima istruzione della downUp(“Hello”) può essere eseguita.
n Hello
def downUp(word):
# @param word : string
if len(word)<=1 :
print word
else :
print word
downUp(word[1:])
print word 26
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
Altro tracciamento
n area di T(n)
def areaT(n) :
■ se n = 0 ➨ area T(n) = 0
# @param n: int
■ se n > 0 ➨ area T(n) = n + area T(n-1) # @return int
if n==0 :
return 0
area_T(4) = 4 + area_T(3)
else :
6 area_T(3) = 3 + area_T(2) return n + areaT(n-1)
3
area_T(2) = 2 + area_T(1)
area_T(4) = 10 1
area_T(1) = 1 + area_T(0)
0
area_T(0) = 0
via d’uscita
28
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
n Altrimenti…
■ Scrivi la tua parola sullo “schermo”
■ Recluta un altro elfo
■ Dagli come input la tua parola meno il primo carattere (usando un altro
cartoncino)
■ Aspetta (vicino alla lavagna) finchè l’elfo che hai reclutato ha finito.
■ Scrivi di nuovo la tua parola sullo “schermo”.
■ Hai finito! (puoi tornare al tuo posto)
29
def areaT(n) :
# @param n : int
# @return int
area = 0 def areaT(n) :
for i in range(1, n+1) : # @param n : int
area = area+i # @return int
return area return n*(n+1)/2
def fatt(n)
# @param n : int
# @return int
fn=1
for i in range(1, n+1) :
fn = fn*i
return fn
30
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
… ma può aiutare
n Un problema “complesso”
n Numero di percorsi su una griglia di strade (Manhattan-like)
■ quanti percorsi minimi differenti da A a B?
■ minimi: aventi la minima lunghezza possibile
– ogni segmento tra due incroci ha lunghezza unitaria
■ calcolarlo in modo non ricorsivo? provate …
1 2 3 4 … i …
1 …
A
2 …
3
.
. . . . …
. . . .
j
…
. B
.
31
La ricorsione all’opera
1 …
A
2 …
3
.
. . . . …
. . . . B2
j
…
. B1 B
.
tutti i possibili
percorsi da A
a B1 32
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
caso generale
num. percorsi da A a B =
(num. percorsi da A a B1) + (num. percorsi da A a B2)
1 2 3 4 … i …
soluzione diretta
1 …
se A e B sono sulla stessa A B
2 …
“riga” o sulla stessa
“colonna” 3
.
. . . …
allora .
. . . .
(num. percorsi da A a B) = 1 j
…
. B B
.
33
Codifica Python
coordinate di A
def numOfPaths(ia, ja, ib, jb) :
# @param ia, ja, ib, jb : int coordinate di B
# @return int
if ia>ib or ja>jb :
coordinate mal definite
else:
if (ia==ib or ja==jb) :
soluzione diretta
else :
caso generale
Codifica Python
if ia>ib or ja>jb :
print "ill defined coordinates"
return 0
else: ...
35
Un esercizio di ricorsione
– operazioni aritmetiche su numeri naturali usando solo le operazioni di
incremento e decremento di 1
• somma (x, y )
– x = 0 ⇒ somma (x, y ) = y (soluzione diretta)
– x > 0 ⇒ somma (x, y ) = somma (x-1, y ) +1 (caso generale)
• prodotto (x, y )
– x = 0 ⇒ prodotto (x, y ) = 0 (soluzione diretta)
– x > 0 ⇒ prodotto (x, y ) = somma(prodotto (x-1, y ), y) (caso generale)
37
Esempio
38
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
39
caso generale
una stringa è palindroma se :
• il primo e l’ultimo carattere sono uguali
• la stringa ottenuta rimuovendo il primo e l’ultimo carattere è palindroma
40
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
• rimane il ...
soluzione diretta
una stringa di zero o un carattere è palindroma
41
def isPalindrome(s) :
# @param s : string
# @return bool soluzione diretta
if len(s) <= 1 :
return True
elif s[0] == s[len(s)-1] : ultimo carattere
primo carattere
shorter = s[1:len(s)-1] stringa “semplificata”
return isPalindrome(shorter)
else : caso generale
return False
42
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
variante
def isPalindrome(s) :
# @param s : string
# @return bool
soluzione diretta if len(s) <= 1 :
return True
else:
def isPalindrome(s) :
return s[0] == s[len(s)-1] and isPalindrome(s[1:len(s)-1])
# @param s : string
caso generale
# @return bool
if len(s) <= 1 :
return True
elif s[0] == s[len(s)-1] :
shorter = s[1:len(s)-1]
return isPalindrome(shorter)
else :
return False 43
44
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
45
def fib(n) :
• codifica Python # @param n : int
in forma # @return int
ricorsiva : assert (n>=0)
if n==0 :
return 0
elif n <= 2 : return 1
else : return fib(n - 1) + fib(n - 2) 46
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
48
fib(6)
+
3
fib(5) fib(4)
+ +
2
fib(4) fib(3) fib(3) fib(2)
+ + +
fib(2) fib(1) 1 1 1 1 1
1 1
49
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
n Obiettivi di apprendimento
■ generali
■ introdurre una nuova strategia di soluzione
■ casi di studio
■ conteggio percorsi alternativi
■ ...
51
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
rappresentazione ["The old brown fox runs", ["bold", 0, 6], ["italics", 5, 12]]
inizio à integer
52
fine à integer
inizio à integer
fine à integer
53
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
analizza( ["questo e' un testo con stile", [0, 2,"bold"], [5, 8, "italics"]] ) = ?
analizza( [“questo e' un testo con stile”, [0, 2], [5, 8, "italics"]] ) = ?
analizza( ["questo e' un testo con stile", [0, "bold"], [5, 8, "italics"]] ) = ?
Appendice 2: compressione/decompressione di
stringhe basata su RLE
n decompressione :
■ funzione di avvio
def unzip(string) :
# @param string: str; string to be decompressed
# @return str; the decompressed string
if len(string) == 0 :
return ""
else:
return unzipState0(string,"")
59
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
60
61
Dipartimento di Ingegneria Civile e Fondamenti di Informatica – prof. V. Grassi
Ingegneria Informatica
n compressione :
■ provate a realizzare l'ASF ...
62