17
Fondamenti di Informatica Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 10. Programmazione Ricorsiva 10. Programmazione Ricorsiva Ing. Ing. Simona Colucci Simona Colucci

Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 10. Programmazione Ricorsiva

Embed Size (px)

Citation preview

Page 1: Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 10. Programmazione Ricorsiva

Fondamenti di InformaticaFondamenti di Informatica

CDL in Ingegneria Gestionale (B)- A.A. 2010-2011CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

10. Programmazione Ricorsiva10. Programmazione Ricorsiva Ing. Ing. Simona ColucciSimona Colucci

Page 2: Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 10. Programmazione Ricorsiva

Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari

Fondamenti di InformaticaFondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

IndiceIndice

• La formulazione in termini ricorsivi di problemi e algoritmi

• La ricorsione come strumento di programmazione • L’esecuzione dei sottoprogrammi ricorsivi • Ulteriori esempi

Page 3: Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 10. Programmazione Ricorsiva

Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari

Fondamenti di InformaticaFondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

La formulazione in termini La formulazione in termini ricorsivi ricorsivi

di problemi e algoritmidi problemi e algoritmi

• La ricorsione: durante l’esecuzione di un sottoprogramma P avviene una nuova chiamata allo stesso P – ricorsione indiretta :

• P chiama -durante la sua esecuzione- un altro sottoprogramma Q

• Q a sua volta chiama un terzo R, …• R chiama nuovamente P

– ricorsione diretta: P chiama se stesso durante la propria esecuzione

Page 4: Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 10. Programmazione Ricorsiva

Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari

Fondamenti di InformaticaFondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

Un esempio classicoUn esempio classico

• Individuare, in un gruppo di palline l’unica pallina di peso maggiore delle altre facendo uso di una bilancia “a basculla” (Per semplicità: il numero di palline sia una potenza di 3)

• Algoritmo Pesate:− Se il gruppo di palline consiste in una sola pallina, allora

essa è banalmente la pallina cercata, altrimenti procedi come segue.

− Dividi il gruppo di palline in tre e confronta due dei tre sottogruppi.

− Se i due gruppi risultano di peso uguale scarta entrambi, altrimenti scarta il gruppo non pesato e quello risultato di peso minore.

− Applica l’algoritmo Pesate al gruppo rimanente.

Page 5: Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 10. Programmazione Ricorsiva

Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari

Fondamenti di InformaticaFondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

Un esempio matematicoUn esempio matematico

• La sommatoria di una sequenza di numeri

00

1

i

ia

n

iin

n

ii aaa

11

1

1

Page 6: Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 10. Programmazione Ricorsiva

Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari

Fondamenti di InformaticaFondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

La ricorsione come strumentoLa ricorsione come strumentodi programmazionedi programmazione

Calcolo del Fattoriale in modo ricorsivo:

int FattRic(int n){

int ris;if (n == 0) ris = 1;else ris = n * FattRic(n–1);return ris;

}

Page 7: Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 10. Programmazione Ricorsiva

Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari

Fondamenti di InformaticaFondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

L’esecuzione di sottoprogrammi L’esecuzione di sottoprogrammi ricorsiviricorsivi

• Calcolo del fattoriale di 3 con l’uso dello schema di chiamata ai sottoprogrammi noto:– Il valore del parametro attuale, 3, viene copiato nel

parametro formale, n – Ha inizio l’esecuzione di FattRic. Essa giunge a

n*FattRic(2), il cui risultato dovrebbe essere assegnato alla cella FattRic per poi essere passato al chiamante

– A questo punto avviene la nuova chiamata di FattRic.– Il nuovo valore del parametro attuale, 2, viene copiato

nella cella n, cancellando il precedente valore 3

Necessità di associare un aerea dati per ogni esecuzione del sottoprogramma: attivazione

Page 8: Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 10. Programmazione Ricorsiva

Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari

Fondamenti di InformaticaFondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

L’esecuzione di sottoprogrammi L’esecuzione di sottoprogrammi ricorsiviricorsivi

record di attivazione

Seconda attivazione

2

Terza attivazione1

Quarta attivazione

0

1*1 = 1

2*1 = 2

Prima attivazione

n FattRic

3 3*2 = 6

1

Page 9: Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 10. Programmazione Ricorsiva

Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari

Fondamenti di InformaticaFondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

L’esecuzione di sottoprogrammi L’esecuzione di sottoprogrammi ricorsiviricorsivi

Passaggio parametri per indirizzo:

void incrementa(int *n, int m){

if (m != 0){

*n = *n + 1; incrementa(n, m–1);

}}

Page 10: Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 10. Programmazione Ricorsiva

Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari

Fondamenti di InformaticaFondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

L’esecuzione di sottoprogrammi L’esecuzione di sottoprogrammi ricorsiviricorsivi

y

3Area dati della funzione chiamante

x

2

Prima attivazione

n m

3

3

Seconda attivazione

2

4

Terza attivazione1

5

Quarta attivazione

0

5

incrementa(&x, y)

Page 11: Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 10. Programmazione Ricorsiva

Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari

Fondamenti di InformaticaFondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

L’esecuzione di sottoprogrammi L’esecuzione di sottoprogrammi ricorsivi: la gestione a pila della ricorsivi: la gestione a pila della

memoriamemoria

• La memoria per l’esecuzione di un sottoprogramma ricorsivo non può essere allocata staticamente

• La conseguente perdita di efficienza può essere limitata usando una disciplina LIFO (Last In First Out) per la chiamata dei sottoprogrammi: la prima esecuzione a terminare è sempre quella relativa all’ultima chiamata

• L’organizzazione di memoria utilizzata è la pila• Ogni aerea dati è chiamata record di

attivazione

Page 12: Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 10. Programmazione Ricorsiva

Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari

Fondamenti di InformaticaFondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

L’esecuzione di sottoprogrammi L’esecuzione di sottoprogrammi ricorsiviricorsivi

la gestione a pila della memoria (a)la gestione a pila della memoria (a)

Variabili globali

main

record di attivazione del main

P1

record di attivazione di P1

P2’

record di attivazione di P2’

P3

record di attivazione di P3

P2”record di attivazione di P2"

Page 13: Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 10. Programmazione Ricorsiva

Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari

Fondamenti di InformaticaFondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

L’esecuzione di sottoprogrammi L’esecuzione di sottoprogrammi ricorsivi(6) la gestione a pila della ricorsivi(6) la gestione a pila della

memoria (b)memoria (b)

P1 P2’ P3 P2”main

Variabili globali

record di attivazione del main

record di attivazione di P1

record di attivazione di P2’

record di attivazione di P3

record di attivazione di P2"

P3P2’

Page 14: Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 10. Programmazione Ricorsiva

Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari

Fondamenti di InformaticaFondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

L’esecuzione di sottoprogrammi L’esecuzione di sottoprogrammi ricorsivi(7)ricorsivi(7)

la gestione a pila della memoria (c)la gestione a pila della memoria (c)

Variabili globali

record di attivazione del main

record di attivazione di P1

record di attivazione di P2’

P3P2’

main P1 P2’ P3 P2”

P4

record di attivazione di P4

P2’P1main

Page 15: Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 10. Programmazione Ricorsiva

Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari

Fondamenti di InformaticaFondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

Ulteriori esempi (1)Ulteriori esempi (1)

/* Programma RicPalindr*/#include <stdio.h>#include <string.h> typedef enum {false, true} boolean; void main (){

#define LunghMaxStringa 100 

char Stringa1[LunghMaxStringa];boolean OK;unsigned LunghStringa;

 boolean Palindrome (char *PC, char *UC);

/* L’istruzione seguente assume che i caratteri componenti la stringa non siano spazi */scanf ("%s", Stringa1);LunghStringa = strlen (Stringa1);if (LunghStringa == 0)

printf ("La stringa è palindroma");else…

Page 16: Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 10. Programmazione Ricorsiva

Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari

Fondamenti di InformaticaFondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

Ulteriori esempi (2)Ulteriori esempi (2)

/* Programma RicPalindr*/…else{

/* Viene chiamata la funzione Palindrome passando per indirizzo il primo e l'ultimo carattere della stringa da analizzare */

OK = Palindrome (&Stringa1[0], &Stringa1[LunghStringa–1];

if (OK == true)printf ("La stringa è palindroma”);

elseprintf ("La stringa non è palindroma");

}} boolean Palindrome (char *PC, char *UC)…

Page 17: Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 10. Programmazione Ricorsiva

Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari

Fondamenti di InformaticaFondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

Ulteriori esempi (3)Ulteriori esempi (3)

/* Programma RicPalindr*/… 

boolean Palindrome (char *PC, char *UC){

if (PC >= UC)/* Se la stringa è vuota o è costituita da un solo carattere */

return true;else if (*PC != *UC)

/* Se il primo e l'ultimo carattere sono diversi */return false;

else/* Chiama se stessa ricorsivamente escludendo il primo e l'ultimo

carattere */return Palindrome (PC+1, UC–1);

}