La Programmazione Ricorsiva

Slides:



Advertisements
Presentazioni simili
INFORMATICA Algoritmi fondamentali
Advertisements

                      Insertion-Sort
Sottoprogrammi: funzioni e procedure
Uso avanzato di C.
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.
Stringhe di caratteri In linguaggio C.
Procedure e funzioni ricorsive
LE FUNZIONI IN C Sommario 1 Introduzione 2 Moduli di programma in C
1 Informatica Generale Susanna Pelagatti Ricevimento: Mercoledì ore presso Dipartimento di Informatica, Via Buonarroti,
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Fondamenti di Informatica CDL in Ingegneria Gestionale (B)- A.A CDL in Ingegneria Gestionale (B)- A.A Programmazione Ricorsiva.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Introduzione al linguaggio C
Introduzione al linguaggio C Dr. Francesco Fabozzi Corso di Informatica.
La ricorsione Simulazione. Il Main /* Programma che usa una funzione ricorsiva*/ #include #define MAX_N 8 main() int valore, dato; printf(Introduci n:
Iterazione enumerativa (for)
Tail recursion: esempio
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Stringhe e Puntatori Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013.
Laboratorio di Linguaggi lezione VIII Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
Laboratorio di Linguaggi lezione IX: Dentro le Librerie Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese.
Corso di Informatica (Programmazione)
INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA
CORSO DI PROGRAMMAZIONE II
CORSO DI PROGRAMMAZIONE II Introduzione alla ricorsione
LdL - LP1 - ver. 6 - lez aa Linguaggi di programmazione I La ricorsione Prof. Luigi Di Lascio Lezione 10.
Esercizi su pile Scrivere una funzione che restituisca una nuova pila che contiene i valori di una pila in ingresso in ordine inverso. La pila originale.
1 Strutture Dinamiche Corso di Informatica A Vito Perrone.
Strutture di controllo nel C
Esercizi FUNZIONI Passaggio di parametri per valore, variabili e tipi locali e globali, prototipo.
Politecnico di Milano Esercizi Stringhe Ricerca binaria.
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Politecnico di Milano Esercizi Preparazione alla prima prova intermedia.
Introduzione alla Ricorsione
Le liste dinamiche La ricorsione
Le funzioni.
FUNZIONI: IL MODELLO APPLICATIVO 1) Valutazione, nellenvironment corrente, del simbolo che denota il nome della funzione; 2) Valutazione, nellenvironment.
DEFINIZIONE DI NUOVE FUNZIONI & STRATEGIE DI COMPOSIZIONE La capacità di definire nuove funzioni permette: di definire nuove operazioni di introdurre variabili.
Equazione di secondo grado.
1 ListaDiElem Cancella( ListaDiElem lista, TipoElemento elem ) { ListaDiElem puntTemp; if( ! ListaVuota(lista) ) if( lista–>info == elem ) { puntTemp =
Algoritmi e Strutture Dati
Il linguaggio C Le funzioni C Language Il passaggio dei parametri
Massimo Comun Divisore
Programmazione di Calcolatori
Esercizi Liste.
1 Parte 5 Fondamenti di Programmazione. 2 Programmazione Concetti base: dati istruzioni Dati: variabili tipi Istruzioni: istruzioni base strutture di.
Ricorsione Strumento potente per definizioni matematiche
2000 Prentice Hall, Inc. All rights reserved. Attivazione di funzioni La chiamata/attivazione di funzione viene indicata citando il nome della funzione.
Complessità di un algoritmo
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 2 La ricorsione Corso di Informatica 2 a.a. 2003/04 Lezione 2.
1 Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza Valentina Ciriani ( ) Laboratorio di programmazione Lezione 11 e 12 -
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE La Ricorsione Marco D. Santambrogio – Ver. aggiornata al 29 Maggio 2014.
Sistemi e Tecnologie Informatiche Ricorsione Umberto Ferraro Petrillo.
Esercitazioni su liste
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE La Ricorsione Marco D. Santambrogio – Ver. aggiornata al 21 Maggio 2014.
La ricorsione.
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
Sottoprogrammi e funzioni
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Marzo 2014.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
Informatica 4 La ricorsione. Definizione di ricorsione Ricorsione è la proprietà di quei programmi che, all’interno delle istruzioni che li compongono,
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
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo La ricorsione 15 Approccio ricorsivo, esercizi sulla.
13. Strutture dati dinamiche Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE INFORMATICA Focus on.
10. Programmazione Ricorsiva Ing. Simona Colucci
Transcript della presentazione:

La Programmazione Ricorsiva Dr. Mario Pavone CdL Informatica Applicata Università di Catania

Programmazione ricorsiva Chiamata ricorsiva di sottoprogrammi: Un sottoprogramma P chiama -durante la sua esecuzione- un altro sottoprogramma Q Q a sua volta chiama un terzo R, … R chiama nuovamente P: (ricorsione indiretta) Oppure P chiama se stesso durante la propria esecuzione (ricorsione diretta) La soluzione di un dato problema può essere ricavata sulla base della soluzione di un suo sottoproblema più semplice

Un primo esempio di ricorsione Individuare, in un gruppo di palline l’unica pallina di peso maggiore delle altre facendo uso di una bilancia “a basculla” dotata di due piatti in grado di stabilire se i pesi sono uguali o quale dei due è maggiore Per semplicità: il numero di palline sia una potenza di 3 Goal: risolvere il problema con il minor numero di pesate Algoritmo Pesate: Se il gruppo di palline consiste in una sola pallina, allora essa è banalmente la pallina cercata, altrimenti: 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.

Ricorsione e matematica x + 0 = x; x + y = x + Successore(y–1) = Successore (x + (y–1)) : 1+3 = Successore (1+2) = Successore(Successore(1+1)) = Successore(Successore(Successore(1+0))) = Successore(Successore(Successore(1))) = Successore(Successore(2)) = Successore(3) = 4

Ricorsione e matematica I numeri di Fibonacci, F = {f0, ..., fn}: f0 = 0 f1 = 1 Per n > 1, fn = f n–1 + fn–2 Esempio: f2 = f1 + f0 = 1 + 0 = 1 f3 = f2 + f1 = 1 + 1 = 2 f4 = f3 + f2 = 2 + 1 = 3

Ricorsione e matematica La lista inversa L–1 di una lista di elementi L = {a1, ..., an}: se n = 1, L–1 = L; altrimenti, L–1 = {an, (Ln–1)–1} Dove Ln–1 indica la lista ottenuta da L cancellando l’ultimo elemento an. Esempio: 2,7,5,4–1 = 4, 2,7,5–1 = 4, 5, 2,7–1 = 4, 5, 7, 2–1 = 4, 5, 7, 2

Esercizio sulla ricorsione Scrivere un programma che calcoli la seguente sommatoria: si consideri come esempio la successione {2, 5, 7, 9} con n=4

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; }

Ricorsione come strumento di programmazione Calcolo dei numeri di Fibonacci: int fibonacci (int n) { int ris; if (n == 0) ris = 0; else if (n == 1) ris = 1; else ris = fibonacci(n–1) + fibonacci(n–2); return ris; }

Sottoprogrammi ricorsivi Calcolo del fattoriale di 3 (secondo lo schema conosciuto): 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

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

Sottoprogrammi ricorsivi Passaggio parametri per valore e per indirizzo: void incrementa(int *n, int m) { if (m != 0) *n = *n + 1; incrementa(n, m–1); }

Sottoprogrammi ricorsivi y 3 Area dati della funzione chiamante x 2 Quarta attivazione 5 Prima attivazione n m 3 Terza attivazione 1 5 Seconda attivazione 2 4 incrementa(&x, y), con x=2 e y=3

Gestione a “pila” della memoria 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

Gestione a “pila” della memoria Variabili globali record di attivazione del main di P1 di P2’ di P3 di P2" P3 P1 P2’ P3 P2” main P2’

Gestione a “pila” della memoria 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

Esempio di ricorsione: stringa palindroma /* 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); scanf ("%s", Stringa1); LunghStringa = strlung (Stringa1); if (LunghStringa == 0) printf ("La stringa è palindroma"); else …

Esempio di ricorsione: stringa palindroma /* 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"); }

Esempio di ricorsione: stringa palindroma /* Programma RicPalindr*/   boolean Palindrome (char, *PC, char *UC) { /* la stringa è vuota o è costituita da un solo carattere */ if (PC >= UC) return true; else /* Se il primo e l'ultimo carattere sono diversi */ if (*PC != *UC) return false; /* Chiama se stessa ricorsivamente escludendo il primo e l'ultimo carattere */ else return Palindrome (PC+1, UC–1); }