Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoTiziana Napoli Modificato 11 anni fa
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 Ing. Simona Colucci
2
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 Indice La formulazione in termini ricorsivi di problemi e algoritmi La ricorsione come strumento di programmazione L esecuzione dei sottoprogrammi ricorsivi Ulteriori esempi
3
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 La formulazione in termini ricorsivi di problemi e algoritmi La ricorsione: durante lesecuzione 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
4
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 Un esempio classico Individuare, in un gruppo di palline lunica 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 lalgoritmo Pesate al gruppo rimanente.
5
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 Un esempio matematico La sommatoria di una sequenza di numeri
6
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 La ricorsione come strumento di programmazione Calcolo del Fattoriale in modo ricorsivo: intFattRic(int n) { intris; if (n == 0) ris = 1; else ris = n * FattRic(n–1); returnris; }
7
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 Lesecuzione di sottoprogrammi ricorsivi Calcolo del fattoriale di 3 con luso dello schema di chiamata ai sottoprogrammi noto: –Il valore del parametro attuale, 3, viene copiato nel parametro formale, n –Ha inizio lesecuzione 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
8
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 Lesecuzione di sottoprogrammi ricorsivi record di attivazione Seconda attivazione 2 Terza attivazione 1 Quarta attivazione 0 1*1 = 1 2*1 = 2 Prima attivazione nFattRic 3 3*2 = 6 1
9
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 Lesecuzione di sottoprogrammi ricorsivi Passaggio parametri per indirizzo: voidincrementa(int *n, int m) { if (m != 0) { *n = *n + 1; incrementa(n, m–1); }
10
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 Lesecuzione di sottoprogrammi ricorsivi y 3 Area dati della funzione chiamante x 2 Prima attivazione n m 3 3 Seconda attivazione 2 4 Terza attivazione 1 5 Quarta attivazione 0 5 incrementa(&x, y)
11
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 Lesecuzione di sottoprogrammi ricorsivi: la gestione a pila della memoria La memoria per lesecuzione 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 allultima chiamata Lorganizzazione di memoria utilizzata è la pila Ogni aerea dati è chiamata record di attivazione
12
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 Lesecuzione di sottoprogrammi ricorsivi 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"
13
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 Lesecuzione di sottoprogrammi ricorsivi(6) la gestione a pila della memoria (b) P1P2P3P2main 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" P3 P2
14
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 Lesecuzione di sottoprogrammi ricorsivi(7) 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 mainP1P2P3P2 P4 record di attivazione di P4 P2 P1 main
15
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 Ulteriori esempi (1) /* Programma RicPalindr*/ #include typedefenum {false, true} boolean; voidmain () { #defineLunghMaxStringa100 charStringa1[LunghMaxStringa]; booleanOK; unsignedLunghStringa; booleanPalindrome (char *PC, char *UC); /* Listruzione 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 …
16
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 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); else printf ("La stringa non è palindroma"); } booleanPalindrome (char *PC, char *UC) …
17
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011 Ulteriori esempi (3) /* Programma RicPalindr*/ … booleanPalindrome (char *PC, char *UC) { if(PC >= UC) /* Se la stringa è vuota o è costituita da un solo carattere */ return true; elseif (*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); }
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.