1 / 17

10. Programmazione Ricorsiva Ing. Simona Colucci

10. Programmazione Ricorsiva Ing. Simona Colucci. Indice. La formulazione in termini ricorsivi di problemi e algoritmi La ricorsione come strumento di programmazione L ’ esecuzione dei sottoprogrammi ricorsivi Ulteriori esempi. La formulazione in termini ricorsivi di problemi e algoritmi.

Download Presentation

10. Programmazione Ricorsiva Ing. Simona Colucci

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 10. Programmazione RicorsivaIng. Simona Colucci Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

  2. Indice • La formulazione in termini ricorsivi di problemi e algoritmi • La ricorsione come strumento di programmazione • L’esecuzione dei sottoprogrammi ricorsivi • Ulteriori esempi Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

  3. La formulazione in termini ricorsivi di 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 Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

  4. Un 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) • AlgoritmoPesate: • 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. Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

  5. Un esempio matematico • La sommatoria di una sequenza di numeri Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

  6. La ricorsione come strumentodi 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; } Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

  7. L’esecuzione di sottoprogrammi ricorsivi • 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 Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

  8. n FattRic Prima attivazione 3 3*2 = 6 Seconda attivazione 2 2*1 = 2 Terza attivazione 1 1*1 = 1 Quarta attivazione 0 1 L’esecuzione di sottoprogrammi ricorsivi record di attivazione Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

  9. L’esecuzione di sottoprogrammi ricorsivi Passaggio parametri per indirizzo: void incrementa(int*n, int m) { if (m != 0) { *n = *n + 1; incrementa(n, m–1); } } Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

  10. 3 4 5 5 n m Prima attivazione 3 Seconda attivazione 2 Terza attivazione 1 Quarta attivazione 0 L’esecuzione di sottoprogrammi ricorsivi incrementa(&x, y) x y Area dati della funzione chiamante 2 3 Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

  11. L’esecuzione di sottoprogrammi ricorsivi: la gestione a pila della memoria • 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 Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

  12. record di attivazione di P2" main P1 P2’ P3 P2” record di attivazione di P3 record di attivazione di P2’ record di attivazione di P1 record di attivazione del main Variabili globali L’esecuzione di sottoprogrammi ricorsivila gestione a pila della memoria (a) Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

  13. record di attivazione di P2" main P1 P2’ P3 P2” P2’ P3 record di attivazione di P3 record di attivazione di P2’ record di attivazione di P1 record di attivazione del main Variabili globali L’esecuzione di sottoprogrammi ricorsivi(6) la gestione a pila della memoria (b) Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

  14. main P1 P2’ P3 P2” record di attivazione di P4 P2’ P3 record di attivazione di P2’ P4 record di attivazione di P1 main P1 P2’ record di attivazione del main Variabili globali L’esecuzione di sottoprogrammi ricorsivi(7)la gestione a pila della memoria (c) Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

  15. 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; booleanPalindrome (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 … Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

  16. 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"); } } boolean Palindrome (char *PC, char *UC) … Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

  17. 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); } Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A. 2010-2011

More Related