Fondamenti di Informatica II. Algoritmi ricorsivi e Backtracking
|
|
|
- Raffaella Valentino
- 9 anni fa
- Visualizzazioni
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
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
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
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,
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
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
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
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
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
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
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
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è
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
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
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
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
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à
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
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
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
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
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
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
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
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.
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
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
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
