Fondamenti di Informatica - Politecnico di Milano...Daniele Loiacono Problemi nell’uso della...
Transcript of Fondamenti di Informatica - Politecnico di Milano...Daniele Loiacono Problemi nell’uso della...
![Page 1: Fondamenti di Informatica - Politecnico di Milano...Daniele Loiacono Problemi nell’uso della ricorsione qUso della memoria La programmazione ricorsiva comporta spesso un uso inefficiente](https://reader033.fdocument.pub/reader033/viewer/2022052815/60a0ea2f7b65d772ca437f69/html5/thumbnails/1.jpg)
Daniele Loiacono
Programmazione ricorsivaFondamenti di Informatica
![Page 2: Fondamenti di Informatica - Politecnico di Milano...Daniele Loiacono Problemi nell’uso della ricorsione qUso della memoria La programmazione ricorsiva comporta spesso un uso inefficiente](https://reader033.fdocument.pub/reader033/viewer/2022052815/60a0ea2f7b65d772ca437f69/html5/thumbnails/2.jpg)
Daniele Loiacono
Ricorsione
q Che cos’è la ricorsione?Un sottoprogramma P richiama se stesso (ricorsione diretta)Un sottoprogramma P richiama un’altro sottoprogramma Q che comporta un’altra chiamata a P (ricorsione indiretta)
q A cosa serve?È una tecnica di programmazione molto potentePermette di risolvere in maniera elegante problemi complessi
![Page 3: Fondamenti di Informatica - Politecnico di Milano...Daniele Loiacono Problemi nell’uso della ricorsione qUso della memoria La programmazione ricorsiva comporta spesso un uso inefficiente](https://reader033.fdocument.pub/reader033/viewer/2022052815/60a0ea2f7b65d772ca437f69/html5/thumbnails/3.jpg)
Daniele Loiacono
Programmazione ricorsiva
q Per risolvere un problema attraverso la programmazione ricorsiva sono necessari alcuni elementi
Caso base: caso elementare del problema che può essere risolto immediatamentePasso ricorsivo: chiamata ricorsiva per risolvere uno o più problemi più semplici Costruzione della soluzione: costruzione della soluzione sulla base del risultato delle chiamate ricorsive
![Page 4: Fondamenti di Informatica - Politecnico di Milano...Daniele Loiacono Problemi nell’uso della ricorsione qUso della memoria La programmazione ricorsiva comporta spesso un uso inefficiente](https://reader033.fdocument.pub/reader033/viewer/2022052815/60a0ea2f7b65d772ca437f69/html5/thumbnails/4.jpg)
Daniele Loiacono
Esempio: il fattoriale
q Definizione: f(n) = n! = n*(n-1)*(n-2)*…*3*2*1
q Passo ricorsivo: f(n) = n*f(n-1)
q Caso base: f(0)=1
int factRic(int n){
if (n==0) return 1;
else return n*factRic(n-1);
}
![Page 5: Fondamenti di Informatica - Politecnico di Milano...Daniele Loiacono Problemi nell’uso della ricorsione qUso della memoria La programmazione ricorsiva comporta spesso un uso inefficiente](https://reader033.fdocument.pub/reader033/viewer/2022052815/60a0ea2f7b65d772ca437f69/html5/thumbnails/5.jpg)
Daniele Loiacono
Funzionamento ricorsione
int ris = factRic(3);?
ris
![Page 6: Fondamenti di Informatica - Politecnico di Milano...Daniele Loiacono Problemi nell’uso della ricorsione qUso della memoria La programmazione ricorsiva comporta spesso un uso inefficiente](https://reader033.fdocument.pub/reader033/viewer/2022052815/60a0ea2f7b65d772ca437f69/html5/thumbnails/6.jpg)
Daniele Loiacono
Funzionamento ricorsione
int ris = factRic(3);
int factRic(int n){if (n==0) return 1;
elsereturn n*factRic(n-1);}
n:3
?ris
![Page 7: Fondamenti di Informatica - Politecnico di Milano...Daniele Loiacono Problemi nell’uso della ricorsione qUso della memoria La programmazione ricorsiva comporta spesso un uso inefficiente](https://reader033.fdocument.pub/reader033/viewer/2022052815/60a0ea2f7b65d772ca437f69/html5/thumbnails/7.jpg)
Daniele Loiacono
Funzionamento ricorsione
int ris = factRic(3);
int factRic(int n){if (n==0) return 1;
else return n*factRic(n-1);}
n:3
int factRic(int n){if (n==0) return 1;
elsereturn n*factRic(n-1);}
n:2
?ris
![Page 8: Fondamenti di Informatica - Politecnico di Milano...Daniele Loiacono Problemi nell’uso della ricorsione qUso della memoria La programmazione ricorsiva comporta spesso un uso inefficiente](https://reader033.fdocument.pub/reader033/viewer/2022052815/60a0ea2f7b65d772ca437f69/html5/thumbnails/8.jpg)
Daniele Loiacono
Funzionamento ricorsione
int ris = factRic(3);
int factRic(int n){if (n==0) return 1;
else return n*factRic(n-1);}
n:3
int factRic(int n){if (n==0) return 1;
else return n*factRic(n-1);}
n:2
int factRic(int n){if (n==0) return 1;
elsereturn n*factRic(n-1);}
n:1
?ris
![Page 9: Fondamenti di Informatica - Politecnico di Milano...Daniele Loiacono Problemi nell’uso della ricorsione qUso della memoria La programmazione ricorsiva comporta spesso un uso inefficiente](https://reader033.fdocument.pub/reader033/viewer/2022052815/60a0ea2f7b65d772ca437f69/html5/thumbnails/9.jpg)
Daniele Loiacono
Funzionamento ricorsione
int ris = factRic(3);
int factRic(int n){if (n==0) return 1;
else return n*factRic(n-1);}
n:3
int factRic(int n){if (n==0) return 1;
else return n*factRic(n-1);}
n:2
int factRic(int n){if (n==0) return 1;
else return n*factRic(n-1);}
n:1
int factRic(int n){if (n==0) return 1;
else return n*factRic(n-1);}
n:0
?ris
![Page 10: Fondamenti di Informatica - Politecnico di Milano...Daniele Loiacono Problemi nell’uso della ricorsione qUso della memoria La programmazione ricorsiva comporta spesso un uso inefficiente](https://reader033.fdocument.pub/reader033/viewer/2022052815/60a0ea2f7b65d772ca437f69/html5/thumbnails/10.jpg)
Daniele Loiacono
Funzionamento ricorsione
int ris = factRic(3);
int factRic(int n){if (n==0) return 1;
else return n*factRic(n-1);}
n:3
int factRic(int n){if (n==0) return 1;
else return n*factRic(n-1);}
n:2
int factRic(int n){if (n==0) return 1;
else return n*1;}
n:1
?ris
![Page 11: Fondamenti di Informatica - Politecnico di Milano...Daniele Loiacono Problemi nell’uso della ricorsione qUso della memoria La programmazione ricorsiva comporta spesso un uso inefficiente](https://reader033.fdocument.pub/reader033/viewer/2022052815/60a0ea2f7b65d772ca437f69/html5/thumbnails/11.jpg)
Daniele Loiacono
Funzionamento ricorsione
int ris = factRic(3);
int factRic(int n){if (n==0) return 1;
else return n*factRic(n-1);}
n:3
int factRic(int n){if (n==0) return 1;
else return n*1;}
n:2
?ris
![Page 12: Fondamenti di Informatica - Politecnico di Milano...Daniele Loiacono Problemi nell’uso della ricorsione qUso della memoria La programmazione ricorsiva comporta spesso un uso inefficiente](https://reader033.fdocument.pub/reader033/viewer/2022052815/60a0ea2f7b65d772ca437f69/html5/thumbnails/12.jpg)
Daniele Loiacono
Funzionamento ricorsione
int ris = factRic(3);
int factRic(int n){if (n==0) return 1;
else return n*2;}
n:3
?ris
![Page 13: Fondamenti di Informatica - Politecnico di Milano...Daniele Loiacono Problemi nell’uso della ricorsione qUso della memoria La programmazione ricorsiva comporta spesso un uso inefficiente](https://reader033.fdocument.pub/reader033/viewer/2022052815/60a0ea2f7b65d772ca437f69/html5/thumbnails/13.jpg)
Daniele Loiacono
Funzionamento ricorsione
int ris = factRic(3);6
ris
![Page 14: Fondamenti di Informatica - Politecnico di Milano...Daniele Loiacono Problemi nell’uso della ricorsione qUso della memoria La programmazione ricorsiva comporta spesso un uso inefficiente](https://reader033.fdocument.pub/reader033/viewer/2022052815/60a0ea2f7b65d772ca437f69/html5/thumbnails/14.jpg)
Daniele Loiacono
Esempio: Fibonacci
q È una sequenza di numeri interi in cui ogni numero si ottiene sommando i due precedenti nella sequenza. I primi due numeri della sequenza sono per definizione pari ad 1.
f1 = 1 (caso base)f2 = 1 (caso base)fn = fn-1 + fn-2 (passo ricorsivo)
int fiboRic(int n){
if (n==1 || n==2)return 1;
else return fiboRic(n-2)+fiboRic(n-1);
}
![Page 15: Fondamenti di Informatica - Politecnico di Milano...Daniele Loiacono Problemi nell’uso della ricorsione qUso della memoria La programmazione ricorsiva comporta spesso un uso inefficiente](https://reader033.fdocument.pub/reader033/viewer/2022052815/60a0ea2f7b65d772ca437f69/html5/thumbnails/15.jpg)
Daniele Loiacono
Esempio: MCD
q Algoritmo di Euclidese m = n, MCD(m,n) = m (caso base) se m > n, MCD(m,n) = MCD(m-n,n) (caso risorsivo)se m < n, MCD(m,n) = MCD(m,n-m) (caso risorsivo)
q Esempio: MCD(30,18)
30 18
12 18
6 12
6 6
![Page 16: Fondamenti di Informatica - Politecnico di Milano...Daniele Loiacono Problemi nell’uso della ricorsione qUso della memoria La programmazione ricorsiva comporta spesso un uso inefficiente](https://reader033.fdocument.pub/reader033/viewer/2022052815/60a0ea2f7b65d772ca437f69/html5/thumbnails/16.jpg)
Daniele Loiacono
Esempio: MCD
q Algoritmo di Euclidese m = n, MCD(m,n) = m (caso base) se m > n, MCD(m,n) = MCD(m-n,n) (caso risorsivo)se m < n, MCD(m,n) = MCD(m,n-m) (caso risorsivo)
q Implementazione
int MCDeuclidRic(int m, int n){
if (m==n)return m;
else if (m>n)return MCDeuclidRic(m-n,n);
elsereturn MCDeuclidRic(m,n-m);
}
![Page 17: Fondamenti di Informatica - Politecnico di Milano...Daniele Loiacono Problemi nell’uso della ricorsione qUso della memoria La programmazione ricorsiva comporta spesso un uso inefficiente](https://reader033.fdocument.pub/reader033/viewer/2022052815/60a0ea2f7b65d772ca437f69/html5/thumbnails/17.jpg)
Daniele Loiacono
Problemi nell’uso della ricorsione
q Terminazione della catena ricorsivaÈ presente il caso base?Viene raggiunto sempre dalla catena di chiamate ricorsive? Esempi
int factRic(int n){return n*factRic(n-1);
}
int factRic(int n){if (n==0) return 1; else return factRic(n);
}
Catena infinita di chiamatecon argomento decrescente
Catena infinita di chiamateidentiche
![Page 18: Fondamenti di Informatica - Politecnico di Milano...Daniele Loiacono Problemi nell’uso della ricorsione qUso della memoria La programmazione ricorsiva comporta spesso un uso inefficiente](https://reader033.fdocument.pub/reader033/viewer/2022052815/60a0ea2f7b65d772ca437f69/html5/thumbnails/18.jpg)
Daniele Loiacono
Problemi nell’uso della ricorsione
q Uso della memoriaLa programmazione ricorsiva comporta spesso un uso inefficiente della memoria per la gestione degli spazi di lavoro delle chiamate generateIn alcuni casi viene comunque preferita ad altri approcci per la sua eleganza e semplicitàIn altri casi, si può ricorrere ad implementazioni iterativeEsempioint fibList(int n){int f1=1,f2=1,tmp;for (int i=3; i<=n; i++){
tmp = f2;f2 = f1+f2;f1 = tmp;
}return f2;
}
Funzione iterativa checalcola il numero n di fibonacci