Ricorsione. Corso di Fondamenti di Informatica



Documenti analoghi
AA LA RICORSIONE

RICORSIONE - schema ricorsivo (o induttivo) si esegue l'azione S, su un insieme di dati D, mediante eventuale esecuzione di

La ricorsione. Politecnico di Milano Sede di Cremona

Esercitazione 7. Procedure e Funzioni

Ricorsione. (da lucidi di Marco Benedetti)

Esercitazione 3. Corso di Fondamenti di Informatica

Una funzione è detta ricorsiva se chiama, direttamente o indirettamente, se stessa. In C tutte le funzioni possono essere usate ricorsivamente.

Vettori Algoritmi elementari di ordinamento

Puntatori Passaggio di parametri per indirizzo

Algoritmi di Ricerca. Esempi di programmi Java

Object Oriented Software Design

Esercitazione 6. Tutor: Ing. Diego Rughetti. Anno Accademico 2007/2008

Software di base. Corso di Fondamenti di Informatica

Programmazione I - Laboratorio

Funzioni in C. Violetta Lonati

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

RICORSIVITA. Vediamo come si programma la soluzione ricorsiva al problema precedente: Poniamo S 1 =1 S 2 =1+2 S 3 =1+2+3

Esercizi di programmazione in C

10 - Programmare con gli Array

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

LABORATORIO DI PROGRAMMAZIONE EDIZIONE 1, TURNO B

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Introduzione alla tecnica di Programmazione Dinamica

GESTIONE INFORMATICA DEI DATI AZIENDALI

Linguaggio C - Stringhe

La selezione binaria

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Gestione dei File in C

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Sono casi particolari di MCF : SPT (cammini minimi) non vi sono vincoli di capacità superiore (solo x ij > 0) (i, j) A : c ij, costo di percorrenza

Fondamenti dell Informatica Ricorsione e Iterazione Simona Ronchi Della Rocca (dal testo: Kfoury, Moll and Arbib, cap.5.2)

Corso di Informatica

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

Appello di Informatica B

Ricorsione. Rosario Culmone. - p. 1/13

Verifica che una grammatica sia Context Free nel GrammaReader

Introduzione alla programmazione in C

Corso di Informatica

I tipi di dato astratti

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Esercitazioni di Progettazione del Software. Esercitazione (Prova al calcolatore del 17 settembre 2010)

OTTAVA ESPERIENZA DI LABORATORIO. L elaborazione dei files in C

Corso di Tecniche di Programmazione

Informazioni generali

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

Tipi elementari, costanti. Tipi di dati. VALORI: un insieme dei valori del tipo OPERAZIONI: per operare su tali valori. Tipi. intero reale carattere

Matematica generale CTF

Sequenza alternativa degli eventi: Variazione di prezzo superiore al 20% per almeno un articolo.

Due algoritmi di ordinamento. basati sulla tecnica Divide et Impera: Mergesort e Quicksort

Ricerca Automatica. Esercitazione 3. Ascensore. Ascensore. Ascensore

Logica e codifica binaria dell informazione

Progetto MIPS/SPIM. Descrizione. Questa tipologia di progetto consiste in

Gestione delle stringhe in C

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Corso di Laurea in Ingegneria Gestionale Esame di Informatica - a.a luglio 2013

Funzioni. Corso di Fondamenti di Informatica

Tecniche avanzate di sintesi di algoritmi: Programmazione dinamica Algoritmi greedy

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Header. Unità 9. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Il principio di induzione e i numeri naturali.

Crittografia. Primalità e Fattorizzazione. Corso di Laurea Specialistica. in Informatica

Aritmetica dei Calcolatori 1

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Algoritmi e strutture dati. Codici di Huffman

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Fondamenti di Informatica 2

Algoritmi e Strutture Dati

Proof. Dimostrazione per assurdo. Consideriamo l insieme complementare di P nell insieme

Esempio: dest = parolagigante, lettere = PROVA dest (dopo l'invocazione di tipo pari ) = pprrlogvgante

Allocazione dinamica della memoria - riepilogo

Esercizi Capitolo 6 - Alberi binari di ricerca

FUNZIONI. La libreria standard del C fornisce una ricca collezione di funzioni, come le funzioni:

Esercitazione 6. Array

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Caratteri e stringhe Esercizi risolti

RICERCA DI UN ELEMENTO

Transcript:

Dipartimento di Informatica e Sistemistica Antonio Ruberti Sapienza Università di Roma Ricorsione Corso di Fondamenti di Informatica Laurea in Ingegneria Informatica (Canale di Ingegneria delle Reti e dei Sistemi Informatici - Polo di Rieti) Anno Accademico 2007/2008 Prof. Paolo Romano Si ringrazia il Prof. Alberto Finzi per aver reso disponibile il materiale didattico sul quale si basano queste slides

Ricorsione Una funzione che contiene al suo interno una attivazione di se stessa è detta ricorsiva. Esempio: void f(int a) if (a==0) printf("f(%d): ho finito \n,a); else printf("sono f(%d) ",a); printf("chiamata di f(%d) \n",a-1); f(a-1); printf ("f(%d): ho finito \n",a); int main() f(3); Output prodotto: Sono f(3) chiamata di f(2) Sono f(2) chiamata di f(1) Sono f(1) chiamata di f(0) f(0):ho finito f(1):ho finito f(2):ho finito f(3):ho finito

Ricorsione Ricorsione utilizzata per implementare funzioni che ammettono una definizione induttiva Esempio: fattoriale Definizione iterativa: fatt(n) = n (n-1) (n-2) 2 1 Definizione induttiva: 1 se n=0 fatt(n) = n fatt(n-1) se n>0 (base) (passo) Fissata la base dell induzione, il passo induttivo permette la definizione della funzione successiva utilizzando la funzione precedente. Algoritmo: if (n==0) return 1 else calcola il fattoriale di n-1 moltiplicalo per n restituisci il valore ottenuto int fatt(int x) if (x==0) return 1; else return x*fatt(x-1);

Ricorsione Altre definizioni induttive Somma non negativi somma(x,y) = x se y=0 1 + somma(x,y-1) se y>0 (base) (passo) Prodotto non negativi prod(x,y) = 0 se y=0 somma(x, prod(x,y-1)) se y>0 (base) (passo) Potenza non negativi espon(x,y) = 1 se y=0 prod(x, espon(x,y-1)) se y>0 (base) (passo) Esercizio: implementare queste operazioni come funzioni C.

Ricorsione Esempio: leggere sequenza di caratteri interrotte da \n e stampare invertite. Es. legge: arco e stampa ocra Problema: per invertire occorre prima memorizzare tutta le lettere, occorre una struttura per la memorizzazione: 1. Vettore (vediamo più avanti) 2. Sfruttare lo stack di RDA Algoritmo: leggi carattere i-esimo if carattere letto \n fine else stampa il carattere i+1 stampa il carattere corrente void stampainv() char a; scanf("%c",&a); if(a!= '\n') stampainv(); printf("%c",a);

Esempio Leggere una sequenza di caratteri con un punto centrale e decidere se è palindroma (ignorando gli spazi bianchi) Una sequenza è detta palindroma se la seq. letta da destra a sinistra è identica a quella letta da destra (es. anna). Caratterizzazione ricorsiva di una plaindroma: 1. La sequenza costituita solo da. è palindroma 2. Una sequenza x s y è palindorma se lo è s ed x = y Come si può fare senza il. centrale?

Soluzione void palind() char x,y; scanf( %c,&x); if (x==. ) return 1; int main() while ( palind() ) printf( Stringa palindroma, prova ancora!\n ); printf( Stringa non palindroma ); if ( palind() ) scanf( %c,&y); if (x!=y) return 0; return 1; return 0;

Ricorsione Multipla Si ha ricorsione multipla quando un attivazione di funzione causa più di una attivazione ricorsiva della stessa funzione Esempio: n-esimo numero di Fibonacci Sequenza Fibonacci: 0, 1, 1, 2, 3, 5, 8, Def. induttiva Algoritmo if n = 0 return 0 if n = 1 return 1 if n > 1 calcola F(n-2) calcola F(n-1) return F(n-1)+F(n-1) F(0) = 0 n=0 F(1) = 1 n=1 F(n) = F(n-2) + F(n-1) n >1 int fib(int n) if (n==0) return 0; if (n==1) return 1; if (n>1) return fib(n-2) + fib(n-1);

Esempi MCD con funzione ricorsiva: x se y = x MCD(x,y) MCD(x,y-x) se y > x MCD(x-y,y) se x > y int mcd(int x, int y) if (y==x) return x; else if (y > 0) return mcd(x,y-x); else return mcd(x-y,x); Verifica interi primi tra loro: vero se x=1oppure y=1 falso se x 1, y 1e x = y primi(x,y) primi(x,y-x) se x 1, y 1e x < y primi(x-y,y) se x 1, y 1e x > y int primi(int x,int y) if(x==1 y==1) return 1; if(x!=1 && y!=1 && x ==y) return 0; if(x!=1 && y!=1 && x > y) return primi(x,y-x); if(x!=1 && y!=1 && x < y) return primi(x-y,y);

Esempi Resto: resto(x,y) x resto(x-y,y) se 0 x <y se x > y resto(x+y,y) se x < 0 int resto(int x) if (x < y && x y) return x; if (x > y) return resto(x-y,y); if (x <0) return resto(x+y,y); Ackerman: A(m,n) n+1 se m=0 (caso base) A(m-1,1) se n =0 (passo ricorsivo) A(m-1,A(m,n-1)) altrimenti

Tre perni 1, 2, 3 Esempio Torre di Hanoi Pila di dischi dimensione crescente su perno 1 vincoli: - uno solo disco alla volta può essere spostato - disco più grande mai sopra uno più piccolo Problema: come spostare m dischi dal perno 1 al perno 2? Algoritmo: 1. Spostare n-1 dischi da 1 a 3 2. Spostare m-esimo da 1 a 2 3. Spostare n-1 dischi da 3 a 2

Esempio Torre di Hanoi Algoritmo: 1. Spostare n-1 dischi da 1 a 3 2. Spostare m-esimo da 1 a 2 3. Spostare n-1 dischi da 3 a 2 Si utilizza una funzione muovi: void muovi(int n, int s, int d, int a) if (n == 1) muoviundisco(s, d); else muovi(n-1, s, a, d); muoviundisco(s, d); muovi(n - 1, a, d, s); /* muovi */

int main(void) int dischi; /* numero di dischi */ int s, d; /* pali sorgente e destinazione */ printf("numero di dischi? "); scanf("%d", &dischi); printf("palo sorgente? [1, 2 o 3] "); scanf("%d", &s); printf("palo destinazione? [1, 2 o 3] "); scanf("%d", &d); muovi(dischi, s, d, 6 - d - s); return 0; /* main */ Esempio Torre di Hanoi

Esempio Torre di Hanoi Quando si utilizza la ricorsione multipla, il numero di attivazioni può essere esponenziale nella profondità della chiamata ricorsiva (cioè nell altezza della pila di attivazione) Esempio Torre Hanoi: att(n) = numero attivazioni di muovi( )per n dischi = numero spostamento dischi att(n) = 1, n=1 1+2 att(n-1), n>1 att(n) > 2 n-1