CORSO DI PROGRAMMAZIONE II Introduzione alla ricorsione

Slides:



Advertisements
Presentazioni simili
Premessa: si assume di aver risolto (correttamente
Advertisements

RICORSIONE: DEFINIZIONI RICORSIVE
Ricorrenze Il metodo di sostituzione Il metodo iterativo
                      Insertion-Sort
Sottoprogrammi: funzioni e procedure
Ricorsione Procedure e funzioni ricorsive. Definizioni Un oggetto si dice ricorsivo se è definito totalmente o parzialmente in termini di sé stesso La.
Procedure e funzioni A. Ferrari.
Procedure e funzioni ricorsive
Introduzione ad Array e Funzioni 2IC/2ID – a. s.2012/13.
ITIS LATTANZIO Unità Didattica Materia Informatica Funzioni in C++
Le funzioni.
Lez. 121 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Progettazione.
Lez. 41 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Programmazione.
La ricorsione Simulazione. Il Main /* Programma che usa una funzione ricorsiva*/ #include #define MAX_N 8 main() int valore, dato; printf(Introduci n:
Algoritmi e Dimostrazioni Stefano Berardi
Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi.
Iterazione enumerativa (for)
PROGRAMMI DI RICERCA E ORDINAMENTO
Elementi di Matematica
Algoritmi Politecnico di Milano C Primi programmi Politecnico di Milano.
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Il problema della ricerca Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Usa la tecnica del.
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
CORSO DI PROGRAMMAZIONE II
CORSO DI PROGRAMMAZIONE II
CORSO DI PROGRAMMAZIONE II
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati (Mod. B)
1 La frazione come numero razionale assoluto
Progetto di algoritmi: metodologia "Divide et Impera"
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
La Programmazione Ricorsiva
Le funzioni.
DEFINIZIONE DI NUOVE FUNZIONI & STRATEGIE DI COMPOSIZIONE La capacità di definire nuove funzioni permette: di definire nuove operazioni di introdurre variabili.
ITIS LATTANZIO Unità Didattica Materia Informatica Funzioni in C++
Radix-Sort(A,d) // A[i] = cd...c2c1
Algoritmi e Strutture Dati
Lezione 6 Strutture di controllo Il condizionale
Il linguaggio C Le funzioni C Language Il passaggio dei parametri
Passo 3: calcolo del costo minimo
Massimo Comun Divisore
Complessità di un algoritmo
Metodi matematici per economia e finanza. Prof. F. Gozzi
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 1 Cicli ed asserzioni Corso di Informatica 2 a.a. 2003/04 Lezione 1.
Array (ordinamento) CORDA – Informatica A. Ferrari.
Ricorsione CORDA – Informatica A. Ferrari Testi da Alessandro Bugatti
Equazioni.
La scomposizione col metodo di Ruffini
alberi completamente sbilanciati
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE La Ricorsione Marco D. Santambrogio – Ver. aggiornata al 21 Maggio 2014.
La ricorsione.
Allievi Elettrici - AA Le funzioni ricorsive in C
CORSO DI PROGRAMMAZIONE II
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Scrivere e compilare programmi
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
C++:Strutture di Controllo
Flusso di Costo Minimo Applicazione di algoritmi: Cammini Minimi Successivi (SSP) Esercizio 1 Sia data la seguente rete di flusso, in cui i valori riportati.
Informatica 4 La ricorsione. Definizione di ricorsione Ricorsione è la proprietà di quei programmi che, all’interno delle istruzioni che li compongono,
Integrali definiti I parte
Forma normale delle equazioni di 2° grado Definizione. Un'equazione di secondo grado è in forma normale se si presenta nella forma Dove sono numeri.
Algoritmi e Strutture Dati Università di Camerino Corso di Laurea in Informatica (12 CFU) I periodo didattico Emanuela Merelli
La frazione come numero razionale assoluto
L’unità frazionaria ESEMPIO Rappresentazione
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo La ricorsione 15 Approccio ricorsivo, esercizi sulla.
Transcript della presentazione:

CORSO DI PROGRAMMAZIONE II Introduzione alla ricorsione Lezione 5 Introduzione alla ricorsione prof. E. Burattini a.a. 2009-2010

Per illustrare il concetto di ricorsione ricordiamo un metodo matematico per fare dimostrazioni: l’induzione. Mostreremo di seguito alcune dimostrazioni per induzione e i corrispondenti algoritmi ricorsivi.

DIMOSTRAZIONE PER INDUZIONE La dimostrazione per induzione è una tecnica per provare che un asserto S(n) vale per tutti gli interi n maggiori di un certo limite inferiore. Supposto vero l’asserto la dimostrazione consiste in: individuare un caso base, il minimo valore di n, diciamo k, per cui si dimostra l’asserto S(k) dimostrare il passo induttivo, cioè che per ogni n  k , dove S(k) è la base induttiva, S(n) implica S(n+1) o equivalentemente supposto vero S(n) dimostrare che è vero S(n+1).

DIMOSTRAZIONE PER INDUZIONE SOMMA DEI PRIMI N INTERI POSITIVI Vogliamo dimostrare che S(n): a) caso base Poniamo N=1 avremo che è quindi dimostrato vero passo induttivo Dobbiamo ora dimostrare che b) Possiamo scrivere q.e.d.

DEFINIZIONE DI ALGORITMO RICORSIVO Diremo che un algoritmo è ricorsivo se risolve il problema a cui è riferito utilizzando la soluzione dello stesso problema ottenuta ad un livello inferiore cioè in un caso più semplice.

Una funzione ricorsiva per risolvere un problema per prima cosa deve essere in grado di risolvere i casi più semplici, detti casi-base: in queste situazioni la funzione ricorsiva termina e restituisce una soluzione. Nelle altre situazioni, la funzione ricorsiva, deve poter dividere il problema in sotto problemi simili a quello di partenza e da esso differenti solo per le dimensioni. In tal caso la funzione ricorsiva, richiama una copia di se stessa e riprende la computazione. Questa operazione è detta chiamata ricorsiva della funzione.

Nel lucido seguente si mostra come opera una funzione ricorsiva in presenza di un problema di cui si conosca la soluzione per almeno un caso semplice (caso base) e la sua trasformazione da una rappresentazione semplice ad un’altra di dimensioni maggiori.

COME FUNZIONA LA RICORSIVITA’ problema(p1 ,…., pk ) caso base ? NO allora applica Applica la soluzione a problema(p’1 ,…., p’k ) caso base ? NO allora applica Applica la soluzione a problema(p”1 ,…., p”k ) caso base ? NO allora applica problema(p*1 ,…., p*k ) caso base ? SI allora applica la soluzione a Dove (pi1 ,…., pik ) sono problemi ridotti del problema precedente

Possiamo dire che in questo modo viene applicato il metodo del In pseudo codice potremmo dire che: if i parametri fanno riferimento a un caso base risolvi il problema else usa i valori dei parametri per un problema ridotto CHIAMA LA FUNCTION PER RISOLVERE IL PROBLEMA RIDOTTO Possiamo dire che in questo modo viene applicato il metodo del DIVIDE ET IMPERA

Un algoritmo iterativo consiste in un unico processo che ripete le stesse identiche operazioni molte volte. Un algoritmo ricorsivo consiste in un numero finito di processi aperti uno dopo l’altro e posti in uno stack. Non appena si chiude un processo subito si scende nello stack e si chiude il processo immediatemente seguente e così via di seguito. problema(p*1 ,…., p*k ) problema(p”1 ,…., p”k ) problema(p’1 , …., p’k ) problema(p1 ,… . ., pk )

Per scrivere un algoritmo ricorsivo bisogna soddisfare le seguenti condizioni: 1. Esiste almeno un caso base la cui soluzione è banale 2. Tutti i sottoproblemi devono poter essere risolti in termini di versioni ridotte di uno stesso problema 3. Le azioni applicate per la soluzione di un problema ridotto portano sempre alla soluzione di un problema più grande 4. In funzione di quanto sia grande il problema iniziale deve essere sempre possibile trovare almeno un caso base nel corso della elaborazione del problema originale.

Riportiamo di seguito una serie di esempi che illustrano l’uso della ricorsività in maniera adeguata. Iniziamo con una funzione che calcola la somma dei primi N numeri interi positivi. A tal fine si ricordi la dimostrazione per induzione introdotta precedentemente.

Sommatoria dei primi N interi positivi 1. La somma dei primi 0 interi positivi vale 0. 2. La somma dei primi N interi positivi è uguale alla somma dei primi N-1 interi più N. int Sum(int N) { if N=0 Sum =0; else Sum =N+ Sum(N-1); }; Un processo come quello qui descritto si dice per accumulazione.

Sommatoria dei primi N interi positivi La rappresentazione nello stack del processo ricorsivo è illustrata di seguito. Come si può osservare vengono aperti tanti processi fin quando non si raggiunge il caso base. A questo punto ogni processo viene chiuso inviando il risultato raggiunto al processo che lo precede nello stack. Caso base 1+ Sum(0) int Sum(int N) { if N=0 Sum =0; else Sum =N+ Sum(N-1); }; Sum =1 2+Sum(1) Sum =3 Sia N=5 3+ Sum(2) Sum =6 4+ Sum(3) Sum =10 5+ Sum(4) Sum =15 Inizio del processo Risultato

Codice della funzione che calcola la somma dei primi N numeri interi positivi. // Somma ricorsiva #include <iostream> using namespace std; // PROTOTIPI int somma(int ,int); // MAIN int main () { int N; cout<<" A partire da 1 fino a che numero vuoi fare la somma? "; cin>>N; cout<<"\n La somma dei primi "<<N<<" e' pari a "<<somma(N)<<endl; system("pause"); } // DEFINIZIONI int somma(int N) { if (N==0) return 0; else return somma((N-1))+N ; }

Quando si applica un processo ricorsivo bisogna assicurarsi che le variabili riguardanti la ricorsione siano passate per valore mentre le variabili in cui eventualmente si accumulano dati, esempio il numero di passi totale, vanno passate per riferimento.

Ad esempio se vogliamo mostrare il risultato del calcolo della somma parziale dei primi N interi positivi diciamo ogni M passi è necessario introdurre una variabile che tenga conto delle varie somme parziali e che va chiamata per valore. Di seguito mostriamo il codice.

void somma(int ,int, int&); / / MAIN int main () { int s=0; // PROTOTIPO void somma(int ,int, int&); / / MAIN int main () { int s=0; somma(N,M,s); cout<<"\n La somma dei primi "<<N<<" numeri mostrata ogni "<<M<< " intervalli e' pari a "<<s<<endl; system("pause"); } // DEFINIZIONE void somma(int N,int M, int &sum) { if (N==0) sum=0; else somma((N-1),M,sum); sum=sum+N; if ((N % M)==0) cout<<"\n La somma dei primi "<<N<<" numeri vale "<<sum<<endl; } return ; } SommaRic

Un altro esempio di algoritmo ricorsivo è quello che valuta la somma delle potenze di 2 da 0 a N. Di seguito mostriamo prima la dimostrazione per induzione del calcolo e quindi l’algoritmo ricorsivo che ad esso si ispira.

Vogliamo dimostrare che: DIMOSTRAZIONI PER INDUZIONE SOMMA DI POTENZE DI 2 Vogliamo dimostrare che: caso base Poniamo n=0 avremo che è quindi dimostrato vero

passo induttivo Dobbiamo ora dimostrare che Supposto sia vero Il membro sinistro può essere riscritto come a) b) Avendo supposto vero l’asserto  Sostituiamo b) in a) c.v.d.

Algoritmo ricorsivo per calcolare la somma delle potenze di 2 tra 0 e N double SumPot(int N) { if (N==0) return 1; else return pow(2,N)+SumPot(N-1); }

Fare la somma delle potenze di 2 tra 0 e N Algoritmo ricorsivo: Fare la somma delle potenze di 2 tra 0 e N Caso base 16+ SumPot (4) SumPot =31 8+ SumPot (3) 4+ SumPot (2) 2+SumPot (1) 1+ SumPot(0) SumPot =1 SumPot =3 SumPot =7 SumPot =15 32+ SumPot (5) SumPot =63 In fig. è mostrato lo stack dei processi aperti nel caso di N=5 Inizio del processo Risultato

In allegato è mostrato un codice che calcola: La somma dei numeri interi tra 1 e N Il valore di 2N La somma delle potenze di 2i con 0<=i<=N Allegato: sommaRic

ESERCIZI Calcolare con una funzione ricorsiva le seguenti espressioni: a) b)