10. Programmazione Ricorsiva Ing. Simona Colucci

Slides:



Advertisements
Presentazioni simili
Uso avanzato di C.
Advertisements

Nel C non esiste un dato primario di tipo stringa; queste sono rappresentate con un array monodimensionale di caratteri (tipo char). Così per definire.
Ricorsione Procedure e funzioni ricorsive. Definizioni Un oggetto si dice ricorsivo se è definito totalmente o parzialmente in termini di sé stesso La.
Procedure e funzioni ricorsive
Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A CDL in Ingegneria Gestionale (B)- A.A Programmazione Ricorsiva.
Introduzione al linguaggio C
La ricorsione Simulazione. Il Main /* Programma che usa una funzione ricorsiva*/ #include #define MAX_N 8 main() int valore, dato; printf(Introduci n:
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Stringhe e Puntatori Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013.
Corso di Informatica (Programmazione)
LdL - LP1 - ver. 6 - lez aa Linguaggi di programmazione I La ricorsione Prof. Luigi Di Lascio Lezione 10.
Strutture di controllo nel C
Esercizi FUNZIONI Passaggio di parametri per valore, variabili e tipi locali e globali, prototipo.
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Introduzione alla Ricorsione
Le liste dinamiche La ricorsione
La Programmazione Ricorsiva
Le funzioni.
Il linguaggio C Le funzioni C Language Il passaggio dei parametri
void binario(int n); …………………
Massimo Comun Divisore
2000 Prentice Hall, Inc. All rights reserved. Attivazione di funzioni La chiamata/attivazione di funzione viene indicata citando il nome della funzione.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE La Ricorsione Marco D. Santambrogio – Ver. aggiornata al 29 Maggio 2014.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE La Ricorsione Marco D. Santambrogio – Ver. aggiornata al 21 Maggio 2014.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Ottobre 2014.
Informatica 4 Funzioni. FUNZIONE: definizione MATEMATICA Relazione (o applicazione) binaria tra due insiemi A e B che associa a ogni elemento di A un.
Allievi Elettrici - AA Le funzioni ricorsive in C
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE La Ricorsione Marco D. Santambrogio – Ver. aggiornata al 29 Maggio 2014.
10. Programmazione Ricorsiva Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
13. Strutture dati dinamiche Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
Le funzioni in C++. Introduzione  Spesso alcuni gruppi di operazioni vengono ripetute in diverse parti all’interno del medesimo programma  Si pensi.
1 Elementi DI INFORMATICA Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica Linguaggio C A.A. 2011/2012
Fondamenti di Informatica A - Massimo Bertozzi LE FUNZIONI.
1 ELEMENTI DI INFORMATICA Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica Linguaggio C A.A. 2011/2012
Algoritmi Avanzati a.a.2015/2016 Prof.ssa Rossella Petreschi
Introduzione al linguaggio C
7. Strutture di controllo Ing. Simona Colucci
Approcci nella soluzione di un problema
Process synchronization
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
iterazione o ricorsione nel pensare per OGGETTI
Process synchronization
Programmazione e Laboratorio di Programmazione
Process synchronization
Copia di oggetti il costruttore di copia ha le stesse particolarità della signature di un costruttore ordinario; il primo parametro è una reference ad.
Fondamenti di Informatica
Ricorsione 16/01/2019 package.
Introduzione agli Algoritmi e alle Strutture Dati
© 2007 SEI-Società Editrice Internazionale, Apogeo
Programmazione e Laboratorio di Programmazione
I SOTTOPROGRAMMI.
APPUNTI SUL LINGUAGGIO C
APPUNTI SUL LINGUAGGIO C
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Gestione di un banco di magliette
Process synchronization
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
APPUNTI SUL LINGUAGGIO C Esercizi sugli array e strutture
APPUNTI SUL LINGUAGGIO C
APPUNTI SUL LINGUAGGIO C Allocazione dinamica della memoria
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Transcript della presentazione:

10. Programmazione Ricorsiva Ing. Simona Colucci Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009

Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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 Meccanica - A.A. 2008-2009

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 Meccanica - A.A. 2008-2009

Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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) 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. Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009

Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 Un esempio matematico La sommatoria di una sequenza di numeri Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009

La ricorsione come strumento di 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 Meccanica - A.A. 2008-2009

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 Meccanica - A.A. 2008-2009

L’esecuzione di sottoprogrammi ricorsivi record di attivazione Prima attivazione n FattRic 3 3*2 = 6 Seconda attivazione 2 2*1 = 2 Terza attivazione 1 1*1 = 1 Quarta attivazione 1 Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009

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 Meccanica - A.A. 2008-2009

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

Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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 Meccanica - A.A. 2008-2009

Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 L’esecuzione di sottoprogrammi ricorsivi la gestione a pila della memoria (a) Variabili globali main record di attivazione del main P2” record di attivazione di P2" P1 record di attivazione di P1 P2’ record di attivazione di P2’ P3 record di attivazione di P3 Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009

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

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

Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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 = strlung (Stringa1); if (LunghStringa == 0) printf ("La stringa è palindroma"); else … Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009

Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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”); printf ("La stringa non è palindroma"); }   boolean Palindrome (char *PC, char *UC) Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009

Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A. 2008-2009 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 Meccanica - A.A. 2008-2009