Sunteți pe pagina 1din 8

Divide et Impera

“Aplicabilitatea istoriei in C++”


Principiu de baza:
Divide et impera se bazează pe
principiul descompunerii problemei în
două sau mai multe subprobleme care
se rezolvă, iar solutia pentru problema
initială se obtine combinând solutiile
subproblemelor
 Nu toate problemele pot fi rezolvate
prin folosirea acestei tehnici
Cum se foloseste?
Divide et impera este o tehnică ce
admite o implementare recursivă.
Principiul general prin care se
elaborează algoritmi recursivi este: "ce
se întâmplă la un nivel, se întâmplă la
orice nivel" ,având grijă să asigurăm
conditiile de terminare(conditia ce
permite iesirea din secventa recursiva).
Algoritm
La un anumit nivel avem două posibilităti:
1. s-a ajuns la o problemă care admite o rezolvare
imediată, caz în care se rezolvă si se revine din
apel
2. nu s-a ajuns în situatia de la punctul 1, caz în care
problema curentă este descompusă în
subprobleme, pentru fiecare din ele urmează un
apel recursiv al functiei, după care combinarea
rezultatelor are loc fie pentru fiecare subproblemă
Probleme rezolvate
1. Se citeste un vector cu n
componente, numere naturale. Se cere
să se tipărească valoarea maximă.
Functia căutată va genera valoarea
maximă dintre numerele retinute în
vector pe o pozitie dintre i si j (initial,
i=1, j=n).
Rezolvare:
#include<iostream>
using namespace std;
int v[10],n;
int max(int i, int j)
{ int a, b, m;
if (i==j)
return v[i];
else { m = (i+j)/2; a=max(i, m); b=max(m+1, j);
if (a>b) return a; else return b; }
}
int main( )
{ cout<>n; for (int i=1; i<=n; i++) { cout<<”v[“<<i<>v[i]; }
cout<<”max=”<max(1,n);
Return 0;
}
2.Se dau 3 tije simbolizate prin a,b,c. Pe tija a
se gasesc discuri de diametre diferite, asezate
in ordine descrescatoare a diametrelor privite
de jos in sus. Se cere sa se mute de pe tija a pe
b, utilizand ca tija intermediara tija 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.
Rezolvare:
#include <iostream>
using namespace std;
char a,b,c;
int n;
void hanoi(int n,char a,char b, char c) { if(n==1)
cout<<a<<b<<" "; else { hanoi(n-1,a,c,b); cout<<a<<b<<" ";
hanoi(n-1,c,b,a); } }
int main()
{ cout<<"n=";cin>>n;
hanoi(n,'a','b','c');
}

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