Fondamenti di Informatica II. Algoritmi ricorsivi e Backtracking

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Fondamenti di Informatica II. Algoritmi ricorsivi e Backtracking"

Transcript

1 Università degli studi di Messina Facoltà di Ingegneria Corso di Laurea in Ingegneria Informatica e delle Telecomunicazioni Fondamenti di Informatica II Algoritmi ricorsivi e Backtracking

2 Introduzione Dalla prefazione al libro Algoritmi + Strutture Dati = Programmi di Niklaus Wirth La programmazione è un'arte costruttiva. Come si può insegnare un'attività costruttiva e creativa? Un metodo consiste nel cristallizzare principi elementari di composizione, estratti da molti casi, e mostrarli in modo sistematico. Tuttavia la programmazione è un campo di grande varietà, e spesso richiede complesse attività intellettuali. La credenza che essa possa essere condensata in una specie di puro insegnamento di ricette è sbagliata. Ciò che rimane nel nostro arsenale di metodi didattici è l'attenta selezione e presentazione di esempi importanti. [...] Una caratteristica di questo approccio è che molto viene lasciato allo studente, alla sua diligenza ed alla sua intuizione. Il nostro tenente generale, L. Eulero, confessa apertamente: [...] che in fututo non riempirà mai più di sessanta pagine (di calcoli) per ottenere un risultato che potrebbe essere dedotto in dieci linee, dopo qualche attenta considerazione [...] Tratto da Diatribe du docteur Akakia di Voltaire (Novembre 1752) 2

3 Algoritmi ricorsivi Un oggetto viene detto ricorsivo se esso comprende parzialmente se stesso, o se è definito in termini di se stesso. La ricorsione è uno strumento particolarmente potente per le definizioni matematiche. Alcuni esempi sono costituiti fai numeri naturali, dalle strutture ad albero e da certe funzioni (ad es. Il calcolo del fattoriale). La potenza della ricorsione nasce dalla possibilità di definire un insieme infinito di oggetti con una regola finita. Un insieme infinito di computazioni può, quindi, essere descritto con un programma ricorsivo finito, persino se il programma non contiene iterazioni esplicite. 3

4 Algoritmi ricorsivi (cont.) Gli algoritmi ricorsivi sono appropriati principalmente quando i problemi da risolvere, o le funzioni da calcolare o le strutture dati da elaborare sono già definiti in termini ricorsivi. Le funzioni (in linguaggio C) sono lo strumento necessario e sufficiente per esprimere ricorsivamente i programmi, poichè permettono di dare un nome a delle istruzioni che potranno poi essere invocate con quel nome. Vi sono due tipi possibili di funzioni ricorsive: dirette e indirette. L'uso della ricorsione potrebbe anche non essere immediatamente evidente nel testo di un programma. 4

5 Parametri delle funzioni ricorsive È pratica comune associare ad una funzione un insieme di oggetti locali, cioè variabili, costanti, ecc., che sono definiti localmente alla funzione e non esistono, nè hanno significato, al di fuori di essa. Ogni volta che la funzione viene attivata ricorsivamente, viene creato un nuovo insieme di variabili locali. Sebbene esse abbiano lo stesso nome dei corrispondenti elementi dell'insieme che era locale nella precedente istanza della funzione, i valori sono distinti. I conflitti vengono evitati mediante le regole di visibilità degli identificatori. La stessa regola vale per i parametri della funzione. 5

6 Il problema della terminazione Le funzioni ricorsive, come le istruzioni iterative, introducono la possibilità di computazioni che non terminano. La chiamata ricorsiva di una funzione deve essere subordinata ad una condizione che, ad un certo istante, divenga non soddisfatta. La tecnica fondamentale utilizzata per dimostrare la terminazione di una chiamata ricorsiva consiste nel definire una funzione f(x) (x è l'insieme delle variabili del programma), tale che f(x) 0 implichi la condizione di terminazione e nel dimostrare che f(x) decresce ad ogni chiamata. Nelle applicazioni pratiche è doveroso dimostrare che la massima profondità di ricorsione non solo è finita, ma è anche piccola (uso intensivo della memoria). 6

7 Quando non usare la ricorsione Gli algoritmi ricorsivi sono particolarmente appropriati quando i problemi, o i dati da trattare, sono definiti in termini ricorsivi. Ciò non significa che la presenza di una definizione ricorsiva basti a garantire che il modo migliore per risolvere un problema sia tramite un algoritmo ricorsivo. La spiegazione del concetto di algoritmo ricorsivo mediante esempi inappropriati, è stata una delle cause dell'identificazione del concetto di ricorsione con quello di inefficienza. 7

8 Quando non usare la ricorsione (cont.) La ricorsione deve essere evitata per quella classe di problemi in cui si devono calcolare dei valori che sono definiti in termini di più o meno semplici relazioni di ricorrenza. Fattoriale: f(n)=n*f(n-1) f(0)=1 int fattoriale_r (int n){ if (n==0) return 1; else return n*fattoriale_r(n 1); int fattoriale (int n){ int fatt=1; while(n>0) fatt*=n ; return fatt; Fibonacci: f(n)=f(n-1)+f(n-2) f(1)=1, f(0)=0 int fib_r (int n){ if (n==0 n==1) return n; else return fib_r(n 1)+fib_r(n 2); int fib (int n){ int i=1,fib=1,y=0; if (n==0) return 0; while(i<n){ fib+=y; y=fib y; i++; return fib; 8

9 Quando non usare la ricorsione (cont.) Quindi la lezione da trarre è che la ricorsione deve essere evitata quando esiste una soluzione iterativa ovvia. Ciò però non deve indurre ad evitare la ricorsione a qualunque costo. Il fatto che esistano implementazioni di funzioni ricorsive per macchine essenzialmente non ricorsive, dimostra che, per scopi pratici, ogni programma ricorsivo può essere trasformato in uno puramente iterativo. Questo procedimento, però, necessita della manipolazione esplicita di una pila di chiamata ricorsive che rende l'essenza del programma così oscura che esso diventa estremamente difficile da capire. Concludendo, algoritmi che per loro natura sono ricorsivi, piuttosto che iterativi, dovrebbero essere formulati con delle funzioni ricorsive. 9

10 Algoritmi di Backtracking Un'attività programmativa particolarmente affascinante è quella della risoluzione generale di problemi. Essa consiste nel determinare algoritmi che trovino delle soluzioni a specifici problemi senza seguire una regola fissa di computazione ma che procedano per tentativi. Decomposizione del procedimento in obiettivi parziali che possono essere espressi in termini ricorsivi e consistono nell'esplorazione di un numero finito di sottobiettivi. L'intero procedimento potrebbe essere visto come un processo di ricerca che gradulamente costruisce e percorre (pota) un albero di obiettivi parziali. Per molti problemi tale albero (e quindi il costo della ricerca) cresce molto rapidamente e deve essere potato mediante metodi euristici. 10

11 Algoritmi di Backtracking (cont.) Gli algoritmi di backtracking possono essere schematizzati nel seguente modo: vengono testati dei passi verso la soluzione finale. i passi vengono memorizzati e possono essere successivamente percorsi all'indietro e cancellati, se si scopre che non possono condure alla soluzione globale, cioè che portano ad un vicolo cieco. function tenta (candidato){ inizializza la scelta dei candidati successivi; while(la soluzione non è raggiunta && ci sono ancora candidati){ seleziona il candidato successivo; if (è accettabile){ registralo; if(la soluzione non è raggiunta){ tenta(candidato successivo); if (ha avuto esito negativo) cancella la registrazione; 11

12 Problemi risolvibili con il Backtracking Raggiungibilità in un grafo Il problema delle otto regine Il labirinto Il sudoku 12

n n 1 n = > Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita

n n 1 n = > Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita n! = 1 n( n 1)! se se n n = > 0 0 dove n è un numero intero non negativo Il calcolo del fattoriale

Dettagli

DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA. INFORMATICA B Ingegneria Elettrica. La ricorsione

DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA. INFORMATICA B Ingegneria Elettrica. La ricorsione INFORMATICA B Ingegneria Elettrica La ricorsione Ricorsione Che cos è la ricorsione? Un sottoprogramma P richiama se stesso (ricorsione diretta) Un sottoprogramma P richiama un altro sottoprogramma Q che

Dettagli

Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013

Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013 Programmazione a Oggetti e JAVA Prof. B.Buttarazzi A.A. 2012/2013 Sommario La ricorsione Metodi ricorsivi Esercizi proposti 16/01/2013 2 La ricorsione In Java ogni metodo può chiamare anche se stesso,

Dettagli

Tempo e spazio di calcolo (continua)

Tempo e spazio di calcolo (continua) Tempo e spazio di calcolo (continua) I numeri di Fibonacci come case study (applichiamo ad un esempio completo le tecniche illustrate nei lucidi precedenti) Abbiamo introdotto tecniche per la correttezza

Dettagli

FUNZIONI RICORSIVE PROGRAMMAZIONE RICORSIVA: Esempi di problemi ricorsivi:

FUNZIONI RICORSIVE PROGRAMMAZIONE RICORSIVA: Esempi di problemi ricorsivi: FUNZIONI RICORSIVE Una funzione matematica è definita ricorsivamente quando nella sua definizione compare un riferimento (chiamata) a se stessa. Esempio: Esempi di problemi ricorsivi: 1) Somma dei primi

Dettagli

Un tipico esempio è la definizione del fattoriale n! di un numero n, la cui definizione è la seguente:

Un tipico esempio è la definizione del fattoriale n! di un numero n, la cui definizione è la seguente: Pag 29 4) La ricorsione 4.1 Funzioni matematiche ricorsive Partiamo da un concetto ben noto, quello delle funzioni matematiche ricorsive. Una funzione matematica è detta ricorsiva quando la sua definizione

Dettagli

Il passo del gambero. Nel labirinto. Nel labirinto. La soluzione di problemi con la tecnica del Backtracking

Il passo del gambero. Nel labirinto. Nel labirinto. La soluzione di problemi con la tecnica del Backtracking Il passo del gambero La soluzione di problemi con la tecnica del Backtracking In ogni posizione provo sistematicamente tutte le strade, ricordando ogni volta l ultima scelta compiuta Ordine in cui tenteremo

Dettagli

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati Algoritmi e Strutture Dati Capitolo 1 Un introduzione informale agli algoritmi Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Definizione informale di algoritmo Insieme di istruzioni, definite

Dettagli

Fondamenti di Informatica

Fondamenti di Informatica Vettori e matrici #1 Le variabili definite come coppie sono dette variabili scalari Fondamenti di Informatica 5. Algoritmi e pseudocodifica Una coppia è una variabile

Dettagli

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

Fondamenti di Informatica 6. Algoritmi e pseudocodifica Vettori e matrici #1 Fondamenti di Informatica 6. Algoritmi e pseudocodifica Corso di Laurea in Ingegneria Civile A.A. 2010-2011 1 Semestre Prof. Giovanni Pascoschi Le variabili definite come coppie

Dettagli

Informatica 3. LEZIONE 10: Introduzione agli algoritmi e alle strutture dati

Informatica 3. LEZIONE 10: Introduzione agli algoritmi e alle strutture dati Informatica 3 LEZIONE 10: Introduzione agli algoritmi e alle strutture dati Modulo 1: Perchè studiare algoritmi e strutture dati Modulo 2: Definizioni di base Informatica 3 Lezione 10 - Modulo 1 Perchè

Dettagli

Problemi, algoritmi, calcolatore

Problemi, algoritmi, calcolatore Problemi, algoritmi, calcolatore Informatica e Programmazione Ingegneria Meccanica e dei Materiali Università degli Studi di Brescia Prof. Massimiliano Giacomin Problemi, algoritmi, calcolatori Introduzione

Dettagli

Informatica (A-K) 5. Algoritmi e pseudocodifica

Informatica (A-K) 5. Algoritmi e pseudocodifica Vettori e matrici #1 Informatica (A-K) 5. Algoritmi e pseudocodifica Corso di Laurea in Ingegneria Civile & Ambientale A.A. 2011-2012 2 Semestre Prof. Giovanni Pascoschi Le variabili definite come coppie

Dettagli

Il concetto di calcolatore e di algoritmo

Il concetto di calcolatore e di algoritmo Il concetto di calcolatore e di algoritmo Elementi di Informatica e Programmazione Percorso di Preparazione agli Studi di Ingegneria Università degli Studi di Brescia Docente: Massimiliano Giacomin Informatica

Dettagli

Esempio : i numeri di Fibonacci

Esempio : i numeri di Fibonacci Esempio : i numeri di Fibonacci La successione di Fibonacci F 1, F 2,... F n,... è definita come: F 1 =1 F 2 =1 F n =F n 1 F n 2,n 2 Leonardo Fibonacci (Pisa, 1170 Pisa, 1250) http://it.wikipedia.org/wiki/leonardo_fibonacci

Dettagli

Roadmap. Ricorsione: funzioni ricorsive. Definizione di fattoriale. Definizione dei numeri Fibonacci

Roadmap. Ricorsione: funzioni ricorsive. Definizione di fattoriale. Definizione dei numeri Fibonacci Modulo di Roadmap 0. Primi passi con Java 1. Buone abitudini 2. Tipi di dati primitivi 3. Uso di classi 4. Leggere e scrivere 5. Definire metodi 7. Array e Collection 8. Progetto di classi 9. Ereditarietà

Dettagli

Esercitazione. Ricorsione. May 31, Esercizi presi dal libro di Rosen

Esercitazione. Ricorsione. May 31, Esercizi presi dal libro di Rosen Esercitazione Ricorsione May 31, 2016 Esercizi presi dal libro di Rosen Problema 2 a) sezione 5.3 Data la seguente funzione definita ricorsivamente come: f(n+1) = 2f(n) f(0) = 3 Determinare il valore di

Dettagli

Fondamenti di Informatica - 1. Prof. B.Buttarazzi A.A. 2011/2012

Fondamenti di Informatica - 1. Prof. B.Buttarazzi A.A. 2011/2012 Fondamenti di Informatica - 1 Prof. B.Buttarazzi A.A. 2011/2012 Sommario Operatore? Tipo di dato: struct La ricorsione Funzioni ricorsive Esercizi proposti 26/04/2012 2 Operatore? L'operatore? può essere

Dettagli

Fondamenti di Informatica T. Linguaggio C: Stack e Ricorsione

Fondamenti di Informatica T. Linguaggio C: Stack e Ricorsione Linguaggio C: Stack e Ricorsione FUNZIONI: IL MODELLO A RUN-TIME Ogni volta che viene invocata una funzione: si crea di una nuova attivazione (istanza) del servitore viene allocata la memoria per i parametri

Dettagli

Funzioni, Stack e Visibilità delle Variabili in C

Funzioni, Stack e Visibilità delle Variabili in C Funzioni, Stack e Visibilità delle Variabili in C Programmazione I e Laboratorio Corso di Laurea in Informatica A.A. 2016/2017 Calendario delle lezioni Lez. 1 Lez. 2 Lez. 3 Lez. 4 Lez. 5 Lez. 6 Lez. 7

Dettagli

Linguaggio C: le funzioni. Visibilità variabili e passaggio parametri

Linguaggio C: le funzioni. Visibilità variabili e passaggio parametri Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica e CAD (c.i.) - ICA Prof. Pierluigi Plebani A.A. 2008/2009 Linguaggio C: le funzioni. Visibilità variabili e passaggio parametri

Dettagli

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati Algoritmi Ricorsivi e Maria Rita Di Berardini, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino A.A. 2006/07 I conigli di Fibonacci Ricerca Binaria L isola dei conigli

Dettagli

Il Concetto Intuitivo di Calcolatore. Esercizio. I Problemi e la loro Soluzione. (esempio)

Il Concetto Intuitivo di Calcolatore. Esercizio. I Problemi e la loro Soluzione. (esempio) Il Concetto Intuitivo di Calcolatore Elementi di Informatica e Programmazione Ingegneria Gestionale Università degli Studi di Brescia Docente: Prof. Alfonso Gerevini Variabile di uscita Classe di domande

Dettagli

Terzo allenamento. Olimpiadi Italiane di Informatica - Selezione territoriale

Terzo allenamento. Olimpiadi Italiane di Informatica - Selezione territoriale Terzo allenamento Olimpiadi Italiane di Informatica - Selezione territoriale Luca Chiodini [email protected] - [email protected] 16 marzo 2017 Programma 1. Lettura e analisi di un problema 2.

Dettagli

Istruzioni Condizionali

Istruzioni Condizionali Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1 Dispensa 6 Istruzioni Condizionali Carla Limongelli Settembre 2006 http://www.dia.uniroma3.it/~java/fondinf1/ Istruzioni condizionali

Dettagli

INFORMATICA A. Titolo presentazione sottotitolo. Laboratorio n 5 Ing. Gian Enrico Conti Dott. Michele Zanella

INFORMATICA A. Titolo presentazione sottotitolo. Laboratorio n 5 Ing. Gian Enrico Conti Dott. Michele Zanella INFORMATICA A Titolo presentazione sottotitolo A.A. 2017-18 Milano, XX mese 20XX Laboratorio n 5 Ing. Gian Enrico Conti Dott. Michele Zanella Info Logistiche (cont d) Calendario laboratori Data Orario

Dettagli

Introduzione al linguaggio C Funzioni

Introduzione al linguaggio C Funzioni Introduzione al linguaggio C Funzioni Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica Violetta Lonati

Dettagli