Sunteți pe pagina 1din 4

Lucrare de laborator 2

DIVIDE ET IMPERA
Aceasta metoda are la baza urmatorul principiu:se descompune problema in doua sau mai
multe subprobleme iar solutia finala se obtine combinand Solutia problemelor in care a fost
descompusa.Procedeul se reia pana cand in urma descompunerilor repetate se ajunge la problem
care admit rezolvare imediata.Metoda admite in toate cazurile o implentare recursive.
Aplicatii rezolvate
1) Cautare binara
Se da un vector v ordonat ascendent si o valoare de cautat.Problema cere sa se gaseasca
toate poazitiile pe care se gaseste aceaasta valoare iar daca ea nu exista intre valorile
vectorului sa se dea un mesaj adecvat.
Solutie
O solutie cu rezolvare liniara(o(n)) inseamna compararea cu fiecare valoare a vectorului
in parte.Cautarea binara duce la o solutie subliniara(o(logn)).Cautarea binara inseamna a
imparti intervalul in doua si de vedea in care din interval se afla valoarea cautata
procedeu care re repeat recursive pana se ajunge la valoarea cautata.Pentru implementare
se considera doi indici I si j (initial i=1,j=n).Apoi se procedea astfel:
-

Daca valoarea de cautat nr coincide cu valoarea de indice (i+j)/2 care e valoarea din
mijloc se tipareste indicele si se revine din apel
Daca nr este mai mic decat valoarea din mijloc atunci cautam in intervalul I, ((i+j)/2)1 caz in care reapelam functia cu acesti parametri.
Daca nr este mai mare decat valoarea din mijloc atunci cautam in
intervalul((i+j)/2)+1, j caz in care reapelam functia cu acesti parametric.
#include<stdio.h>
int v[100],n,nr;
void caut(int I,int j)
{if(nr==v[(i+j)/2] printf(gasit indice %d,(i+j)/2);else
if(i<j) if(nr<(i+j)/2) caut(i,(i+j)/2-1) else caut((i+j/)2+1,j);}}
main
{printf(n=);scanf(%d,&n);printf(numarul de cautat este);scanf(%d,&nr);

for(int i=1;1<=n;i++)
{printf(v[%d]=%d\n,i,v[i]);scanf(%d,&v[i]);} caut(1,n);}
2)Turnurile din Hanoi
Se dau trei tije simbolizate prin a,b,c.Pe tija a se gasesc discuri de diameter diferite
asezate in ordinea descrescatoare a diametrelor de jos in sus.Se cere sa se mute
discurile de pe tija a pe tija b utilizand tija intermediara c respectand urmatoarele
reguli:
La fiecare pas se muta un singur disc
Nu este permis sa se aseze un disc cu diametrul mai mare peste un disc cu diametrul
mai mic

Solutie
Pentru n=1 se face mutarea ab,adica se muta discul de pe tija a pe tija b
Pentru n=2 se fac mutarile ac,ab,cb
Pentru n>2 conform strategiei Divide et Impera incercam sa desco[unem problema in alte
doua in alte doua subprobleme de acelasi tip ,urmand apoi combinarea solutiilor.
Astefel mutarea celor n discuri de pe tija a pe tija b utilizand tija intermediara c este
echivalenta cu:
-

Mutarea a n-1 discuri de pe tija pe tija c utilizand tija intermediara c


Mutarea discului ramas pe tija b
Mutarea a n-1 discuri de pe tija c pe tija b utilizand tija intermediara a

Parcurgerea celor trei etape permite definirea recursiva a functiei H(n,a,b,c) astfel:
-

ab daca n=1
H(n-1,a,c,),ab,H(n-1,c,b,a) daca n>1
Pentru n=2 avem H(2,a,b,c)=H(1,a,c,b),ab,H(1,c,b,a)=ac,ab,cb.
Pentru n=3 avem
H(3,a,b,c)=H(2,b,c,a),ab,H(2,a,b,c)=H(1,a,b,c),ac,H(1,b,c,a),ab,H(1,c,a,b),cb,H(1,a,b,
c)=ab,ac,bc,ab,ca,cb,ab.
#include<stdio.h>
char a,b,c;
int n;
void han(int n,char a, char b,char c)
{if(n==1) {printf(a=);scanf(%d,&a);printf(b=);scanf(%d,&b);}
else
{han(n-1,a,c,b);
printf(%d %d,a,b);han(n-1,c,b,a);}}
main()
{printf(n=);scanf(%d,&n);
a=a;b=b;c=c;

han(n,a,b,c);}
3)Problema matematica de a afla cu o aproximatie data o radacaina intr-un interval
dat.
Fie ecuatia x3+x+1=0. Se cere sa se gaseasca cu o aproximatie data radacaina sa reala
aflata in intervalul (-1,1).
Solutie
Din punct de vedere matematic se aplica o consecinta a teoremei lui Darboux care
spune ca daca o ecuatie are o radacina reala in intervalul [a,b] atunci avem
f(a)xf(b)<0 .
De remercat ca aceasta teorema se aplica daca ecuatia are o singura radacina sau un
un numar impar de radacini in acest interval.
Pentru a scrie un program se aplica metoda cautarii binare cu injumatatirea
intervalului la fiecare iteratie doar ca aici spre a vedea daca in pasul urmator mergem
in intervalul din stanga sau din dreapta aplicam consecinta teoremei lui Darboux
vazand care interval are valori opuse ale functiei la cele doua capete.
La inceput max-min este 1.Dupa prima iteratie max-min =1/2 iar dupa iteratia n maxmin este 1/2n.Algoritmul se va desfasura atat timp cat precizia dorita valoare de
intrare in program este mai mica decat 1/2n.
#include <stdio.h>
main()
{double max,min,rad=-0.5,pre=1,prec;
min=-1; max=0;rad=(max+min)/2;
printf(precizia este);scanf(%lf,&prec);
while(pre>prec)
{printf(radacina aproximativa este %lf,rad);
if((min*min*min+min+1)*(rad*rad*rad+rad+1)<0)
{max=rad;printf(tip 1\n);}
else
{min=rad;printf(tip2);}
rad=(max+min)/2;pre=*0.5;}
printf(radacina aproximativa este %lf,rad);}
Tema
1)Scrieti un program aplicand cautarea binara in care calculatorul ghiceste un numar
propus de de programator.Atunci cand calculatorul propune un numar I I se va
raspunde cu:
-1 daca numarul este prea mare
- 2 daca numarul este prea mic
- 0 daca numarul a fost ghicit
Solutie
Programul va propune numere intr-un interval oarecare(de exemplu de la 1 la 20000)
iar operatorul va rapunde cu 1 sau 2.In continuare programul in functie de raspuns va
trece in intervalul din stanga sau dreapta si va alege de acolo mijlocul noului interval
ales.
Exemplu:Presupunem ca numarul ales este 11625

Numar propus de program


raspuns
20000
1
10000
2
15000
1
12500
1
11625
0
2)Se citeste un numar natural n.Sa se scrie o functie recursive care returneaza cea mai
mica baza in care se poate considera n.

S-ar putea să vă placă și