AA 2006-07 LA RICORSIONE



Похожие документы
Ricorsione. (da lucidi di Marco Benedetti)

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

Ricorsione. Corso di Fondamenti di Informatica

Esercitazione 7. Procedure e Funzioni

Introduzione alla tecnica di Programmazione Dinamica

Matlab: Funzioni. Informatica B. Daniele Loiacono

Funzioni in C. Violetta Lonati

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

Permutazione degli elementi di una lista

Corso di Informatica

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

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

Sommario. Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi.

La ricorsione. Politecnico di Milano Sede di Cremona

INFORMATICA 1 L. Mezzalira

Algoritmi di Ricerca. Esempi di programmi Java

Tecniche avanzate di sintesi di algoritmi: Programmazione dinamica Algoritmi greedy

Informatica 3. Informatica 3. LEZIONE 10: Introduzione agli algoritmi e alle strutture dati. Lezione 10 - Modulo 1. Importanza delle strutture dati

Laboratorio di programmazione

Concetto di Funzione e Procedura METODI in Java

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

3) Il seguente numerale A1F0 in base 16 a quale numero in base 10 corrisponde?

Introduzione al Linguaggio C

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

Programmazione I - Laboratorio

Introduzione alla programmazione in C

INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI

Elementi di Informatica

4.1 Modelli di calcolo analisi asintotica e ricorrenze

Introduzione al MATLAB c Parte 2

1 introdurre le monete per l importo necessario. 2 selezionare la quantità di zucchero. 3 selezionare la bevanda desiderata

Ricerca binaria. Operazione dominante: confronto

La selezione binaria

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

La struttura dati ad albero binario

COS È UN LINGUAGGIO? LINGUAGGI DI ALTO LIVELLO LA NOZIONE DI LINGUAGGIO LINGUAGGIO & PROGRAMMA

FONDAMENTI di INFORMATICA L. Mezzalira

Descrizione di un algoritmo

Tipi di Dato Ricorsivi

Esercizi Capitolo 6 - Alberi binari di ricerca

Lezione 8. La macchina universale

Appunti di Sistemi Elettronici

4 3 4 = 4 x x x 10 0 aaa

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

Processo di risoluzione di un problema ingegneristico. Processo di risoluzione di un problema ingegneristico

+ / operatori di confronto (espressioni logiche/predicati) / = > < Pseudo codice. Pseudo codice

(Esercizi Tratti da Temi d esame degli ordinamenti precedenti)

Università degli Studi di Cassino Corso di Fondamenti di Informatica Puntatori. Anno Accademico 2010/2011 Francesco Tortorella

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Gestione dei File in C

Ricorsione. Rosario Culmone. - p. 1/13

COGNOME E NOME (IN STAMPATELLO) MATRICOLA

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it

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

Algoritmi e strutture dati. Codici di Huffman

Algoritmi e Strutture Dati

Inizializzazione, Assegnamento e Distruzione di Classi

Testi di Esercizi e Quesiti 1

Analizzatore lessicale o scanner

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

Fondamenti di Informatica T-1, 2009/2010 Modulo 2 Prova d Esame 5 di Giovedì 15 Luglio 2010 tempo a disposizione 2h30'

10 - Programmare con gli Array

Fondamenti e didattica di Matematica Finanziaria

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

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

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

A intervalli regolari ogni router manda la sua tabella a tutti i vicini, e riceve quelle dei vicini.

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

Interpretazione astratta

Informatica 3. LEZIONE 21: Ricerca su liste e tecniche di hashing. Modulo 1: Algoritmi sequenziali e basati su liste Modulo 2: Hashing

Corso di Informatica

Richiesta pagina PHP (es: index.php)

Programmazione dinamica

GESTIONE INFORMATICA DEI DATI AZIENDALI

Cenni su algoritmi, diagrammi di flusso, strutture di controllo

Ricerche, ordinamenti e fusioni. 5.1 Introduzione. 5.2 Ricerca completa

Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 17 Dicembre 2005

Linguaggi di programmazione

Linguaggio C - Funzioni

Laboratorio di architettura degli elaboratori Progetto finale AA 2005/2006

Traccia di soluzione dell esercizio del 25/1/2005

LINGUAGGI DI PROGRAMMAZIONE

Appunti del corso di Informatica 1 (IN110 Fondamenti) 2 Algoritmi e diagrammi di flusso

Linguaggio C - Stringhe

Linguaggi. Claudio Sacerdoti Coen 11/04/ : Semantica della logica del prim ordine. Universitá di Bologna

Транскрипт:

PROGRAMMAZIONE AA 2006-07 LA RICORSIONE AA 2006-07 Prof.ssa A. Lanza - DIB 1/18

LA RICORSIONE Il concetto di ricorsione nasce dalla matematica Una funzione matematica è definita ricorsivamente quando nella sua definizione compare un riferimento a se stessa Esempio: n! Il fattoriale di n Definizione iterativa n! = n*(n-1)*(n-2)* *2*1 Definizione ricorsiva: f(n) = n* f (n-1) se n>0 n! = n*(n-1)! f(n) = 1 se n=0 0! = 1 (assioma) AA 2006-07 Prof.ssa A. Lanza - DIB 2/18

LA RICORSIONE Una definizione ricorsiva è specificata tramite Clausola ricorsiva (relazione di ricorrenza) Assioma Principio di induzione Se un predicato P sull insieme N gode delle seguenti proprietà: P(0) è vero da P(k) vero discende la verità di P(k+1) allora P è vero per qualsiasi n appartenente ad N Essenziale disporre dell assioma o passo base Alcuni problemi sono intrinsecamente ricorsivi AA 2006-07 Prof.ssa A. Lanza - DIB 3/18

PROBLEMI RICORSIVI Esempi Somma dei primi numeri naturali somma (n) = n + somma (n-1) somma (n) = 0 se n=0 Generare l n-esimo termine della serie di Fibonacci fib (n) = fib (n-1) + fib (n-2) fib(n) = 1 se n=1 fib(n) =0 se n=0 AA 2006-07 Prof.ssa A. Lanza - DIB 4/18

VARIE PROSPETTIVE Definizione ricorsiva Un oggetto è definito in termini di se stesso Esempio: la definizione di grafo di flusso strutturato Esempio: la definizione di identificatore Scomposizione ricorsiva di problemi Il problema di partenza è scomposto in sottoproblemi formalmente identici al problema di partenza, ma di ordine man mano inferiore sino a giungere ad un sottoproblema banale di cui si conosce la soluzione Algoritmo ricorsivo Un compito è risolto applicando lo stesso algoritmo ad un dominio man mano ridotto rispetto a quello originale Sottoprogrammi ricorsivi Unità di programma nel cui corpo invocano se stessi (Ricorsione lineare o non lineare) Ricorsione mutua (A chiama B che, a sua volta, chiama A) AA 2006-07 Prof.ssa A. Lanza - DIB 5/18

PROGRAMMAZIONE RICORSIVA Molti linguaggi (tra cui il C ) offrono la possibilità di definire sottoprogrammi ricorsivi. Dipende dalla modalità di gestione delle attivazioni In C, le chiamate ricorsive vengono gestite come chiamate normali AA 2006-07 Prof.ssa A. Lanza - DIB 6/18

FATTORIALE DI N int fattoriale(unsigned int n) { int risult; if (n = = 0) risult = 1; else risult = n * fattoriale (n-1); /* ricorsione */ return risult; } int iter_fatt (unsigned int n) { int i, risult=1; for (i=2, i<=n; i++) risult = risult * i; return risult; } AA 2006-07 Prof.ssa A. Lanza - DIB 7/18

SOTTOPROGRAMMI ATTIVATI RICORSIVAMENTE Per ogni chiamata della stessa unità viene caricato nello Stack un diverso r.a. Prima che sia terminata l attivazione precedente avviene una nuova attivazione della stessa unità di programma Esempio fattoriale (3) innesca una catena di invocazioni sino a fattoriale (0). Nello Stack ci saranno 4 r.a. fattoriale (0) fattoriale (1) fattoriale (2) AA 2006-07 Prof.ssa A. Lanza - DIB 8/18 fattoriale (3)

SOTTOPROGRAMMI ATTIVATI RICORSIVAMENTE fattoriale(3) fattoriale (2) fattoriale (1) fattoriale (0) ULTIMA CHIAMATA produce 1 return 1*1 return 2*1 return 3*2 viene passato 6 L ultima chiamata corrisponde al passo base (condizione di terminazione) Il valore di ritorno viene costruito a ritroso : man mano che vengono deallocati i r.a. sino all innesco delle chiamate ricorsive AA 2006-07 Prof.ssa A. Lanza - DIB 9/18

DISCUSSIONE Algoritmi eleganti, sinteticità e semplici Soluzioni ricorsive sono vicine alla definizione matematica di molte funzioni La implementazione è pesante Le versioni iterative sono generalmente più efficienti delle ricorsive Qualunque algoritmo ricorsivo è risolubile anche iterativamente AA 2006-07 Prof.ssa A. Lanza - DIB 10/18

RICORSIONE LINEARE Somma dei primi n numeri naturali int sum (unsigned int n) { int risult; if (n = = 0) risult = 0; else risult = n+ sum (n-1); /* ricorsione */ return risult; } AA 2006-07 Prof.ssa A. Lanza - DIB 11/18

RICORSIONE NON LINEARE N-esimo numero di Fibonacci int fib (unsigned int n) { int risult; if (n = = 0) risult = 0; else if (n = = 1) risult = 1; else risult = fib (n-1) + fib (n- 2); return risult; } int fib (unsigned int n) { switch(n) { case 0: return 0; break; case 1: return 1; break; default: return (fib (n-1) + fib (n-2) ); } } ATT.NE alla STRUTTURAZIONE (più di un return) AA 2006-07 Prof.ssa A. Lanza - DIB 12/18

Esercizio 1 int funz (unsigned int n); main () { int x, y; scanf( %d,&x); y = funz (x); printf (y); } int funz (unsigned int n) { int risult; if (n = = 0) risult = 1; else risult = n * (funz (n-1) +1); return risult; } Verificare che l output prodotto dal programma in corrispondenza di input 4 sia 88 AA 2006-07 Prof.ssa A. Lanza - DIB 13/18

Esercizio 2 Scrivere una funzione C che riceva due parametri interi x ed y e restituisca il valore f(x, y) dove la funzione f è definita come segue: f(x,y) = 1 se y =0 3+ f (x, y-1) se y>0 Risolvere l esercizio proposto AA 2006-07 Prof.ssa A. Lanza - DIB 14/18

ESERCIZI sulla RICORSIONE Stampare al contrario una sequenza di caratteri terminata da. letta in ingresso (senza usare il tipo array e stringa) Es. ROMA. AMOR Riformuliamo il problema: Invertire una sequenza di caratteri E una procedura (non una funzione) Una soluzione iterativa ha bisogno di un array di caratteri Vedere Algoritmo iterativo per invertire un array AA 2006-07 Prof.ssa A. Lanza - DIB 15/18

ESERCIZI sulla RICORSIONE Se la sequenza contiene una sola lettera allora Scrivila (il problema è risolto) altrimenti: Rimuovi la prima lettera dalla sequenza Inverti la sequenza rimanente Appendi in coda la lettera rimossa AA 2006-07 Prof.ssa A. Lanza - DIB 16/18

ESERCIZI sulla RICORSIONE Invertire ROMA ROMA (4 lettere): rimuovi R, inverti OMA OMA (3 lettere): rimuovi O, inverti MA MA (2 lettere): rimuovi M, inverti A» A (1 lettera): è già invertita Appendi M : AM Appendi O : AMO Appendi R : AMOR AA 2006-07 Prof.ssa A. Lanza - DIB 17/18

ESERCIZI sulla RICORSIONE Determinare del massimo/minimo in un array Calcolo della lunghezza di una sequenza di elementi Generare le permutazioni degli elementi di un insieme Ricerca sequenziale e binaria Algoritmi di ordinamento (per selezione, per partizionamento, per fusione, ) AA 2006-07 Prof.ssa A. Lanza - DIB 18/18