Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di...

81
Lezione XII Ricorsione

Transcript of Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di...

Page 1: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

Lezione XIIRicorsione

Page 2: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.2

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Scopo della lezione

• Definire e implementare metodi ricorsivi

Page 3: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.3

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Ricorsione

• Dal dizionario Garzanti (http://www.garzantilinguistica.it)

agg.1 (mat.) si dice di unasuccessione di funzioniognuna delle quali siricavi dalla precedente

Definizione

Deriv. di ricorrere, sulmodello del fr. récursif

Etimologia

ricorsivoLemma

Page 4: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.4

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Una definizione più operativa

:)

agg.vedere ricorsivo

Definizione

Deriv. di ricorrere, sulmodello del fr. récursif

Etimologia

ricorsivoLemma

Page 5: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.5

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

E per gli informatici?

• Un metodo si dice ricorsivo quando la sua esecuzione può prevedere unachiamata a esso stesso– in modo diretto, i.e. il corpo del metodo

prevede una chiamata al metodo stesso– in modo indiretto, i.e. il corpo del metodo

prevede chiamate a metodi che a loro voltachiamano il metodo originario

Page 6: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.6

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esempio

• Cosa succede durante l’esecuzione del seguente metodo main()?

class Ricorsione {static int n=0;public static void main(String[] args) {n++;main(args);

}}

Page 7: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.7

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esecuzioneviene inizializzatala variabile statican al valore 0 ...

class Ricorsione {static int n=0;public static void main(String[] args) {n++;main(args);}}

Ricorsionen=0

Page 8: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.8

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esecuzione... viene eseguito ilmetodo main ...

class Ricorsione {static int n=0;public static void main(String[] args) {n++;main(args);}}

Ricorsionen=0 main

Page 9: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.9

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esecuzione... che incrementail valore di n ...

class Ricorsione {static int n=0;public static void main(String[] args) {n++;main(args);}}

Ricorsionen=1 main

Page 10: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.10

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esecuzione... viene salvato lo “stato” correntedell’esecuzione(ultima istruzioneeseguita, valoridelle variabililocali, etc.) ..

class Ricorsione {static int n=0;public static void main(String[] args) {n++;main(args);}}

Ricorsionen=1 main

.

Page 11: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.11

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esecuzioneed eseguita la chiamata ricorsiva

class Ricorsione {static int n=0;public static void main(String[] args) {n++;main(args);}}

Ricorsionen=1 main

Page 12: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.12

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esecuzione... ricominciandoda capo l’esecuzione dimain.Va notato che ilmetodoabbandonatorimane in unostato “sospeso”, pronto a continuare la suaesecuzione

class Ricorsione {static int n=0;public static void main(String[] args) {n++;main(args);}}

Ricorsionen=1 mainmain

Page 13: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.13

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esecuzioneclass Ricorsione {static int n=0;public static void main(String[] args) {n++;main(args);}}

Ricorsionen=2 mainmainmain

Page 14: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.14

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esecuzioneclass Ricorsione {static int n=0;public static void main(String[] args) {n++;main(args);}}

Ricorsionen=7 mainmainmainmainmainmainmainmain Eccezione

Fino a che nellamacchina virtualenon c’è più spazioper allocare nuovecopie del metodomain. In quelmomento vienegenerataun’eccezione.

Page 15: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.15

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Prova di esecuzioneclass Ricorsione {static int n=0;public static void main(String[] args) {n++;System.out.println(n);main(args);

}}malchiod% java Ricorsione12...Exception in thread "main" java.lang.StackOverflowError

Page 16: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.16

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Chiamate ricorsive

• Il fatto che lo stato locale del metodovenga salvato prima di ogni chiamataricorsiva evita che ci siano interferenzetra diverse istanze dello stesso metodo

Page 17: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.17

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Attenzione!

• Ma l’esecuzione non controllata di metodiricorsivi è potenzialmente pericolosa

• La progettazione di metodi ricorsivi devequindi prevedere che la catena dichiamate vada a termine

Page 18: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.18

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esercizio 1-1• Implementare una classe Fattoriale

che calcola ricorsivamente il fattoriale di un numero

Fattoriale

int calcola(int n);

difficoltà

Page 19: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.19

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Idea

• Sfruttiamo la definizione ricorsiva di fattoriale

fattoriale(n) =1 se n = 0n fattoriale(n −1) altrimenti

Page 20: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.20

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

La classe Fattorialeclass Fattoriale {public static int calcola(int n) {int ritorno;if(n<=1)ritorno = 1;

elseritorno = n * calcola(n-1);

return ritorno;}

public static void main(String args[]) {int n = Integer.parseInt(args[0]);System.out.println("fatt("+n+")=”+calcola(n));

}}

Page 21: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.21

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esecuzione

% javac Fattoriale.java % java Fattoriale 4fatt(4)=24% java Fattoriale 10fatt(10)=3628800% java Fattoriale 20fatt(20)=-2102132736%

Page 22: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.22

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Sperimentiamo

• Perché non si riesce a calcolare il fattoriale di 20?

• Modificate il programma in modo da riuscire a evitare questo problema.

Page 23: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.23

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esercizio 1-2

• Modificare il programma in modo che visualizzi quanti e quali chiamate vengono effettuate al metodo ricorsivo

Fattoriale

int calcola(int n);

difficoltà

Page 24: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.24

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Idea

• Aggiungiamo la stampa di opportuni messaggi all’inizio e alla fine della procedura

Page 25: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.25

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

La classe Fattorialepublic static int calcola(int n) {

int ritorno;System.out.println(

"Inizio chiamata per n=" + n);if(n<=1)

ritorno = 1;else ritorno = n * calcola(n-1);System.out.println(”Fine chiamata per

n=" + n + " (valore ritornato: " +ritorno + ")");

return ritorno;}

Page 26: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.26

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esecuzione

% java Fattoriale 5Inizio chiamata per n=5Inizio chiamata per n=4Inizio chiamata per n=3Inizio chiamata per n=2Inizio chiamata per n=1Fine chiamata per n=1 (valore ritornato: 1)Fine chiamata per n=2 (valore ritornato: 2)Fine chiamata per n=3 (valore ritornato: 6)Fine chiamata per n=4 (valore ritornato: 24)Fine chiamata per n=5 (valore ritornato: 120)fatt(5)=120%

Page 27: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.27

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Sperimentiamo

• La leggibilità dell’output migliora se si riesce a indentare i messaggi in apertura e chiusura di ogni chiamata;

• Riuscite a modificare il codice in modo che i messaggi relativi all’argomento nvengano preceduti da n caratteri separatori (spazio, trattino, …)?

Page 28: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.28

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esercizio 1-3

• Indentare i messaggi stampati nell’esercizio 1-2

Fattoriale

int calcola(int n);

difficoltà

Page 29: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.29

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

La classe Fattorialepublic static int calcola(int n) {for(int i=0;i<n;i++)System.out.print("-");

System.out.println("Inizio chiamata per n=" + n);int ritorno;if(n<=1)ritorno = 1;

elseritorno = n * calcola(n-1);

for(int i=0;i<n;i++)System.out.print("-");

System.out.println("Fine chiamata per n=”+n+" (valore ritornato: "+ritorno+")");

return ritorno;}

Page 30: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.30

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esecuzione

% java Fattoriale 5-----Inizio chiamata per n=5----Inizio chiamata per n=4---Inizio chiamata per n=3--Inizio chiamata per n=2-Inizio chiamata per n=1-Fine chiamata per n=1 (valore ritornato: 1)--Fine chiamata per n=2 (valore ritornato: 2)---Fine chiamata per n=3 (valore ritornato: 6)----Fine chiamata per n=4 (valore ritornato: 24)-----Fine chiamata per n=5 (valore ritornato: 120)fatt(5)=120%

Page 31: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.31

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

I numeri di Fibonacci

• Nel 1223 a Pisa si svolse una gara tra abachisti e algoritmisti. Il questito era

Quante coppie di conigli si ottengono in un anno -salvo i casi di morte- supponendo che ogni coppia dia alla luce un'altra coppia ogni mese e che la riproduzione inizi al secondo mese di vita?

• Leonardo Pisano, detto Fibonacci, vinse la gara indicando come soluzione una sequenza il cui generico elemento era pari alla somma dei due precedenti.

Page 32: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.32

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

I numeri di Fibonacci (2)

f (1) =1f (2) =1f (n) = f (n −1) + f (n − 2) ∀n > 2

1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 2415781739088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903 2971215073 4807526976 777874204912586269025 20365011074 32951280099 53316291173 86267571272 139583862445 225851433717 365435296162 591286729879 9567220260411548008755920 2504730781961 4052739537881 6557470319842 10610209857723 17167680177565 27777890035288 44945570212853 72723460248141 117669030460994 190392490709135 308061521170129 498454011879264 806515533049393 1304969544928657 2111485077978050 3416454622906707 5527939700884757

Page 33: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.33

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esercizio 2-1

• Implementare una classe che stampi un generico numero di Fibonacci

Page 34: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.34

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

La classe Fibonacci

Fibonacci

public int fibo(int n);

difficoltà

Page 35: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.35

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

La classe Fibonacciclass Fibonacci {public static int fibo(int n) {int ritorno;if(n<=1)ritorno = n;

elseritorno = fibo(n-1) + fibo(n-2);

return ritorno;}

public static void main(String args[]) {int n = Integer.parseInt(args[0]);System.out.println("fib(" + n + ")=” + fibo(n));

}}

Page 36: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.36

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esecuzione

% javac Fibonacci.java% java Fibonacci 5fib(5)=5%

Page 37: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.37

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Albero di esecuzione

fibo(3)

Page 38: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.38

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Albero di esecuzione

fibo(2)

fibo(3)

fibo(1)

Page 39: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.39

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Albero di esecuzione

fibo(1)fibo(2)

fibo(0)fibo(3)

fibo(1)

Page 40: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.40

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Albero di esecuzione

fibo(1)=1fibo(2)

fibo(0)fibo(3)

fibo(1)

Page 41: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.41

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Albero di esecuzione

fibo(1)=1fibo(2)

fibo(0)=0fibo(3)

fibo(1)

Page 42: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.42

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Albero di esecuzione

fibo(1)=1fibo(2)=1

fibo(0)=0fibo(3)

fibo(1)

Page 43: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.43

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Albero di esecuzione

fibo(1)=1fibo(2)=1

fibo(0)=0fibo(3)

fibo(1)

Page 44: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.44

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Albero di esecuzione

fibo(1)=1fibo(2)=1

fibo(0)=0fibo(3)

fibo(1)=1

Page 45: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.45

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Albero di esecuzione

fibo(1)=1fibo(2)=1

fibo(0)=0fibo(3)=2

fibo(1)=1

Page 46: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.46

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esercizio 2-2

• Modificare il programma in modo che visualizzi quanti e quali chiamate vengono effettuate al metodo ricorsivo

Fibonacci

public int fibo(int n);

difficoltà

Page 47: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.47

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

La classe Fibonaccipublic static int fibo(int n) {

for(int i=0;i<n;i++)System.out.print("-");

System.out.println("Inizio chiamata n="+n);int ritorno;if(n<=1) ritorno = n;else ritorno = fibo(n-1) + fibo(n-2);for(int i=0;i<n;i++)

System.out.print("-");System.out.println("Fine chiamata n="+n);return ritorno;

}

Page 48: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.48

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esecuzione% java Fibonacci 5-----Inizio chiamata n=5----Inizio chiamata n=4---Inizio chiamata n=3--Inizio chiamata n=2-Inizio chiamata n=1-Fine chiamata n=1Inizio chiamata n=0Fine chiamata n=0--Fine chiamata n=2-Inizio chiamata n=1-Fine chiamata n=1---Fine chiamata n=3--Inizio chiamata n=2-Inizio chiamata n=1-Fine chiamata n=1

Inizio chiamata n=0Fine chiamata n=0--Fine chiamata n=2----Fine chiamata n=4---Inizio chiamata n=3--Inizio chiamata n=2-Inizio chiamata n=1-Fine chiamata n=1Inizio chiamata n=0Fine chiamata n=0--Fine chiamata n=2-Inizio chiamata n=1-Fine chiamata n=1---Fine chiamata n=3-----Fine chiamata n=5fib(5)=5

Page 49: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.49

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Le torri di Hanoi (Edouard Lucas, 1883)

• Una serie di dischi, ognuno con un differente diametro, è impilata su un palo dal disco più grande a quello più piccolo; accanto ad essa vi sono altri due pali.

• Bisogna spostare l’intera pila su un altro palo, muovendo un disco per volta e senza mai posizionare un disco sopra un altro disco di diametro minore.

Page 50: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.50

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esempio

5)1)

2) 6)

3) 7)

4) 8)

Page 51: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.51

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

L’algoritmo

• Immaginiamo di poter spostare un’arbitraria sotto-pila di dischi, sempre rispettando il vincolo di non appoggiare un disco sopra uno più piccolo

• La soluzione sarebbe banale: basterebbe spostare l’intera pila di tre dischi da un palo all’altro

Page 52: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.52

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

L’algoritmo ricorsivo

• Una generica pila di n elementi si può spostare ricorsivamente da un palo sorgente (S) a un palo destinazione (D):– Se n=1, basta spostare il disco da S a D;– Negli altri casi, basta spostare

• n-1 dischi da S al palo libero (L)• Un disco da S a D• n-1 dischi da L a D

Page 53: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.53

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esercizio 3-1

• Implementare una classe che risolva il problema delle torri di Hanoi, per un generico numero di dischi

• Provate a visualizzare le torri man mano che i dischi vengono spostati

Page 54: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.54

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

La classe Hanoi

Hanoi

int numDischi;int torri[][];public Hanoi(int numDischi);public int calcola(int n);public void muovi(int numDischi, int da, int a, int libero);public void sposta(int da, int a);public void visualizza();

difficoltà

Page 55: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.55

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

La classe Hanoipublic class Hanoi {

int numDischi;int torri[][];

public Hanoi(int numDischi) {this.numDischi = numDischi;torri = new int[3][numDischi];for(int i=0;i<numDischi;i++) {

torri[0][i] = i+1;torri[1][i] = 0;torri[2][i] = 0;

}visualizza();muoviDischi(numDischi, 0, 2, 1);

}

Page 56: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.56

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

La classe Hanoipublic void muoviDischi(int numDischi,

int da, int a, int libero) {if(numDischi <= 1) {

System.out.println("muovo da"+da+"a"+ a);sposta(da, a);

} else {muoviDischi(numDischi-1, da, libero, a);System.out.println("muovo da"+da+"a"+ a);sposta(da, a);muoviDischi(numDischi-1, libero, a, da);

}}

Page 57: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.57

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

La classe Hanoipublic void sposta(int da, int a) {

int posDa, posA, i=0;while((torri[da][i] == 0)&&(i<numDischi))

i++;posDa = (i==numDischi) ? numDischi-1:i;i=numDischi-1;while((torri[a][i] != 0)&&(i>0))

i--;posA = i;torri[a][posA] = torri[da][posDa]; torri[da][posDa] = 0;visualizza(); }

Page 58: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.58

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

La classe Hanoipublic void visualizza() {

for(int j=0;j<numDischi;j++) {for(int i=0;i<3;i++)

if(torri[i][j]==0) System.out.print("\t" + 0 + "\t");

elseSystem.out.print("\t"+torri[i][j]

+"\t");System.out.println("");

}System.out.println("\n\n");

}

Page 59: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.59

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

La classe Hanoipublic static void main(String args[]) {Hanoi h = new Hanoi(3);

}

Page 60: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.60

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esecuzionemuovo da 0 a 20 0 00 1 00 2 3

muovo da 1 a 00 0 00 0 01 2 3

muovo da 1 a 20 0 00 0 21 0 3

muovo da 0 a 20 0 10 0 20 0 3

1 0 02 0 03 0 0

muovo da 0 a 20 0 02 0 03 0 1

muovo da 0 a 10 0 00 0 03 2 1

muovo da 2 a 10 0 00 1 03 2 0

Page 61: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.61

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Sperimentiamo

• La leggenda vuole che i monaci di un tempio induista dovessero affrontare questo problema utilizzando 64 dischi in oro, e che a problema risolto il mondo sarebbe finito.

• Secondo voi, possiamo stare tranquilli?

Page 62: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.62

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Sperimentiamo

• Quante operazioni sono necessarie per terminare il nostro algoritmo? A ogni chiamata di muoviDischi vengono effettuate– operazioni in un numero fisso– due chiamate ricorsive alla stessa funzione

• Si può mostrare che questo implica che il numero totale di istruzioni è circa pari a due elevato al numero di dischi

Page 63: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.63

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Quindi…

• Riuscendo a spostare un disco al secondo, in quanto tempo si riesce a spostare la pila di 64 dischi?

• Tenete conto dei seguenti fatti– 264 = 18 446 744 073 709 551 616– L’età stimata dell’universo è dell’ordine di

dieci miliardi di anni

Page 65: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.65

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esercizio 4

• Scrivere un programma che verifichi dopo quante chiamate a un metodo ricorsivo si verifica un’eccezione di Stack Overflow(StackOverflowError è l’eccezione che JAVA lancia, tra le altre cose, quando non può più allocare spazio nella macchina virtuale per ulteriori chiamate a un metodo ricorsivo)

Page 66: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.66

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

La classe BreakItdifficoltà

BreakIt

int n;BreakIt();void breakRecursion();

Idea: n viene inizializzato nel costruttore, breakRecursion lo incrementa e poi richiama se stessa ricorsivamente

Page 67: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.67

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

La classe BreakItclass BreakIt {public int n;public BreakIt() {n = 0;

}public void breakRecursion() {n++;breakRecursion();

}public static void main(String args[]) {

BreakIt b = new BreakIt();b.breakRecursion();

}}

Page 68: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.68

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esecuzione

% javac BreakIt.java% java BreakItException in thread "main"

java.lang.StackOverflowError%

Page 69: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.69

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Miglioriamo BreakIt• Se lo stack è pieno e non è più possibile

effettuare un’ulteriore chiamata ricorsivaa un metodo, viene generata l’eccezione StackOverflowError

• E’ possible intercettare questa eccezione per poter leggere in n il numero totale di chiamate effettuate

Page 70: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.70

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Miglioriamo BreakItpublic static void main(String args[]) {BreakIt b = new BreakIt();try {b.breakRecursion();

} catch (StackOverflowError e) {System.out.println("Overflow dopo " +b.n + " chiamate");

}}

}

Page 71: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.71

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esecuzione

% javac BreakIt.java% java BreakItOverflow dopo 7129 chiamate %

Page 72: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.72

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Sperimentiamo

% javac BreakIt.java% java BreakItOverflow dopo 6225 chiamate %

Se dichiariamo la variabile di istanza di BreakIt di tipo long…

Il numero di iterazioni dipende dalla quantità di memoria a disposizione.

Page 73: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.73

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Rimozione della ricorsione

• Sebbene gli algoritmi ricorsivi siano tipicamente compatti ed eleganti, la loro esecuzione richiede un tempo maggiore dei corrispettivi algoritmi non ricorsivi.

Page 74: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.74

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esercizio 5-1• Modificare la classe Fibonacci in modo

che stampi la sequenza dei primi n numeri di Fibonacci

Fibonacci

public int fibo(int n);public void sequenza(int n);

difficoltà

Page 75: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.75

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Idea

• Avendo a disposizione un metodo che stampa l’ennesimo numero della sequenza di Fibonacci, basta chiamare questo metodo successivamente, all’interno di un opportuno ciclo.

Page 76: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.76

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

La classe Fibonaccipublic static void sequenza(int n) {

for(int i=1;i<=n;i++)System.out.println(fibo(i));

}

public static void main(String args[]) {int n = Integer.parseInt(args[0]);sequenza(n);

}

Page 77: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.77

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esecuzione

% java Fibonacci 1011235813213455

Page 78: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.78

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Sperimentiamo

• Cosa succede se si prova ad eseguire questo programma stampando sequenze via via più lunghe?

Page 79: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.79

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esercizio 5-2

• L’implementazione dell’esercizio 5-1 è decisamente inadeguata, in quanto per ogni output ricomincia a calcolare la sequenza dal suo inizio, mentre basterebbe ogni volta mantenere in memoria solo gli ultimi due elementi prodotti.

• Risolvere l’esercizio 5-1 in modo non ricorsivo

Page 80: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.80

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

La classe Fibonaccipublic static void sequenza(int n) {int prev=1;int prevprev=1;int fibo=2;for(int i=3;i<=n;i++) {

fibo=prev+prevprev;prevprev=prev;prev=fibo;System.out.println(fibo);

}// Attenzione: per semplicita’ presupponiamo// n maggiore di 2.

Page 81: Lezione XII Ricorsione - disi.unige.it · Etimologia Lemma ricorsivo. XII.4 Laboratorio di Informatica Generale Una definizione più operativa:) agg. vedere ricorsivo Definizione

XII.81

Labo

rato

rio d

i Inf

orm

atic

a G

ener

ale

Esecuzione

% java Fibonacci 10235813213455