La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

1. 2 Un caso di studio: il calcolo della radice quadrata. Il modo più semplice per calcolare la radice quadrata di un numero a è quello di utilizzare.

Presentazioni simili


Presentazione sul tema: "1. 2 Un caso di studio: il calcolo della radice quadrata. Il modo più semplice per calcolare la radice quadrata di un numero a è quello di utilizzare."— Transcript della presentazione:

1 1

2 2 Un caso di studio: il calcolo della radice quadrata. Il modo più semplice per calcolare la radice quadrata di un numero a è quello di utilizzare un algoritmo molto antico, usato dai babilonesi, e riproposto da Erone, che consiste nellutilizzare la formula ricorrente Xs = _________________ 2 dove Xp è il valore precedente e Xs è quello successivo. Per poter applicare questa formula è necessario assegnare un valore iniziale a Xp; poiché Xp appare anche al denominatore poniamo come valore iniziale Xp=1. X p + a X p Volendo calcolare la radice di 2, seguiamo i primi passi dellalgoritmo: Xp=1 Xs=(1+2)/2=1,5 Poniamo ora Xp=1,5 Xs=(1,5+2/1,5)/2=1,416 Poniamo ora Xp=1,416 e così via

3 3 Lalgoritmo di Erone di Alessandria (vissuto tra il I° e II° sec. d.C.) utilizza solo le quattro operazioni dellaritmetica. Lalgoritmo si sviluppa sulla base di alcune osservazioni geometriche. Dato un numero A se costruiamo un quadrato di area A, il lato di questo quadrato sarà proprio la radice di A Per costruire questo quadrato eseguiamo una serie di approssimazioni successive partendo da un rettangolo i cui lati misurano h e A/h, con h minore di A. Larea del rettangolo è cioè è uguale allarea del quadrato che cerchiamo. I lati sono invece uno minore e uno maggiore del lato del quadrato. A A

4 4 Calcoliamo ora la media aritmetica delle misure dei due lati del rettangolo, Avremo ovviamente che h 1 è maggiore di h. Costruiamo un nuovo rettangolo i cui lati misurano h 1 e A A

5 5 Avremo ancora che larea del rettangolo, pari a resta uguale a quella del quadrato, mentre h 1 è un valore approssimato per eccesso del lato del quadrato, mentre è un valore approssimato per difetto. La media aritmetica così ottenuta fornisce ora un valore h 1 più vicino a V A di quanto lo fosse h. Calcolando di nuovo la media aritmetica delle misure dei due lati del rettangolo, otteniamo dove ancora h 2 è maggiore di h 1 ma sempre minore di A. A A A A

6 6 Reiteriamo il processo costruendo il rettangolo i cui lati misurano h 2 e. Avremo un valore approssimato per eccesso del lato del quadrato e un valore approssimato per difetto. Il valore di h 2 è però più vicino a A di quanto lo fosse h 1. Proseguendo per questa strada, cioè con successive approssimazioni, costruiamo due successioni di numeri che approssimano, una per eccesso e una per difetto, la radice quadrata di A. A

7 7 Quadrato da costruire l =400 passo1 h passo2 20,519,5 …………. passo3 20 h A A A A A A

8 8 Nella prossima diapositiva si mostra lalgoritmo di Erone mediante un algoritmo iterativo. Viene richiesto il valore dellapprossimazione che si vuole ottenere per il calcolo della radice quadrata ( ) e quindi iterativamente, tramite un ciclo si esegue lalgoritmo fin quando lapprossimazione ottenuta non è minore di.

9 9 Un codice iterativo è il seguente: #include using namespace std; // Calcola radice quadrata main () { const float eps= ; float a,x ; // precondizioni: a>=0 and eps>0 cout << " Calcolo della radice di a: a="; cin >> a; x=1.0; while (fabs(x-a/x)/2>=eps) x=(x+a/x)/2; //Postcondizioni: x>0 |x-a/x|

10 10 Lalgoritmo di Erone si presta perfettamente ad una sua interpretazione in chiave ricorsiva. Il caso base è rappresentato dal raggiungimento del valore di approssimazione richiesta, mentre la chiamata ricorsiva riproduce la formula di Erone.

11 11 // La Radice Quadrata con il metodo di Erone // DEFINIZIONI double radice(double a,double eps1,double &x1) { if ((fabs(x1-a/x1)/2)>=eps1) {x1=(x1+a/x1)/2; return radice(a,eps1,x1); } else return x1; } Allegato: radice quadrata

12 12 ALGORITMI DI RICERCA LINEARE Problema: Cercare tra i valori contenuti in un Array un preassegnato valore. Esempio: Data una lista di N numeri verificare se esiste un preassegnato valore. Un algoritmo ricorsivo, che risolva questa problema presenta due casi base: - la ricerca è finita se nessun elemento uguale a quello cercato esiste - la ricerca è finita se almeno un elemento uguale a quello cercato è stato trovato Supponiamo di partire dallultimo elemento della lista e risalire fino in cima nella ricerca dellelemento.

13 13 Soluzione iterativa: Gestire opportunamente lindice dellarray in cui sono contenuti gli elementi su cui fare la ricerca. I criteri per stabilire il nuovo valore da attribuire allindice possono essere i più diversi. E però importante che una volta stabilito che un elemento individuato da un certo indice non è quello cercato questo elemento non venga più esaminato. Di seguito si mostra una versione iterativa. Si noti che poiché ad ogni passo della ricerca eliminiamo un elemento il massimo numero di passi che potranno essere eseguiti è pari al numero di elementi.

14 14 // MAIN { Indicatore= CercaIndice(Nome, NumeroElementi,ValoreCercato); IF (Indicatore>=0) cout<0) && ( Trovato!=1) { if (Nome[Indice]==ValoreCercato) Trovato= true else Indice= Indice-1; } return Indice; }

15 15 La versione ricorsiva dello stesso algoritmo è la seguente int RicercaLinRic(int a[],int i, int Chiave) { if (i<0) return -1; else { // prendi un Candidato if (a[i] == Chiave) return i; else // rivedi il SubRange riducendo le dimensioni del problema return RicercaLinRic(a, i-1, Chiave); } Chiamata ricorsiva 2° caso base 1° caso base

16 16 Caratteristiche di una ricerca ricorsiva Una chiamata ricorsiva implica sempre una riduzione del sub range di possibili candidati. Quindi nellintestazione è presente almeno un parametro che rappresenta il subrange di elementi. Il valore del parametro in ogni istante di computazione è funzione di un qualche subrange candidato locale. Questa espressione, i cui valori devono rappresentare una riduzione del subrange candidato, viene calcolata e al successivo processo di ricerca i valori ottenuti vengono applicati.

17 17 Caratteristiche di una ricerca ricorsiva La condizione di terminazione è espressa in termini dei parametri del subrange candidato. Questa condizione rappresenta il caso base quando non restano altri subrange candidati alla ricerca. Laltro caso base si ha quando la ricerca ha buon esito, quando cioè a[Candidato] coincide con Chiave.

18 18 Ricerca binaria Assegnato un vettore ordinato A di interi, di dimensione N, determinare la posizione di un elemento mediante una ricerca binaria. Ricordiamo che la ricerca binaria si basa sulla tecnica del divide et impera.

19 19 Ricerca binaria Dividiamo gli elementi in due parti; essendo tutti gli elementi ordinati, confrontiamo lelemento cercato x con il valore M che separa le due parti: se x

20 20 // BINARIA ITERATIVA // basso=indice più piccolo, alto=indice più grande del vettore int RicercaBinIter ( int vet[], int basso, int alto, int x) { int medio, i=-1; while ((basso<=alto) && i==-1) { medio=(basso+alto)/2; if (vet[medio]==x) i=medio ; else if (vet[medio]

21 21 Ricerca binaria ricorsiva Scriviamo la funzione tenendo presente che vet[] è il vettore di interi, x è lelemento da cercare, basso rappresenta lindice minimo, alto quello massimo del vettore di interi int RicercaBinRic (int vet[],int x, int basso, int alto ) if (basso>alto) // è stato analizzato tutto il vettore senza trovare lelemento x: primo CASO BASE else Medio = (basso+alto) / 2; if (vet[Medio]==x) // la funzione deve restituire lindice Medio : secondo CASO-BASE else if (vet[Medio] < x) // deve richiamare le funzione nella metà superiore dellarray else // deve richiamare le funzione nella metà inferiore dellarray

22 22 Il codice è pertanto il seguente. int RicercaBinRic (int vet[],int x, int basso, int alto ) { int Medio; if (basso>alto) return -1; else { Medio = (basso+alto) / 2; if (vet[Medio]==x) return Medio; else if (vet[Medio] < x) return RicercaBinRic (vet, x, Medio+1, alto); else return RicercaBinRic (vet, x, basso, Medio-1); }

23 23 Esercizio Scrivere una funzione ricorsiva che ritorna vero se gli elementi di UnArray di interi, con valori assegnati nel subrange 1..TotElem, sono in ordine crescente. Obiettivo: ricercare un elemento che sia fuori ordine in un dato subrange. Ridurre di volta in volta il subrange fino a quando in questo resta un solo elemento allora vuol dire che la ricerca è finita e la risposta è TRUE. Se invece si verifica che è vera lespressione UnArray[N-1]>UnArray[N] questo significa che è stato trovato un elemento non in ordine e la funzione ritorna FALSE.

24 24 ESERCIZIO Con una function ricorsiva, utilizzando la tecnica dellINSERTION SORT, inserire in maniera ordinata, in un array di numeri interi, i valori letti da tastiera fin quando non si introduce lo 0. insfinale

25 25 void InsertionRic(int a[], int &fine,int j, int &elemento) { if (elemento==0) return; else if (j==0) { a[0]=elemento; fine=fine+1; cout<<" Elemento "; cin>>elemento; return InsertionRic(a,fine,fine,elemento); } else { if (a[j-1]>elemento) { a[j]=a[j-1]; return InsertionRic(a,fine,j-1,elemento); } else { a[j]=elemento; fine=fine+1; cout<<" Elemento "; cin>>elemento; return InsertionRic(a,fine,fine,elemento); } Allegato insertion


Scaricare ppt "1. 2 Un caso di studio: il calcolo della radice quadrata. Il modo più semplice per calcolare la radice quadrata di un numero a è quello di utilizzare."

Presentazioni simili


Annunci Google