Sunteți pe pagina 1din 7

Laborator 11

Principiul recursivităţii

// Aplicaţia 1. Determinarea lui n!

#include<iostream>
using namespace std;

//varianta iterativa
long long factorial_i(int n)
{
long long f=1;
for(int i=1;i<=n;i++)
f*=i;
return f;
}

//varianta recursiva
/*
n!=| 1, daca n=1
| n*(n-1)!, daca n>1

exemplu: 3!=3*2!=3*2*1!=3*2*1
*/
long long factorial_r(int n)
{
if(n==1)
return 1;
return n*factorial_r(n-1);
}

int main()
{
int n;
do{
cout<<"Dati n: ";
cin>>n;
}while(n<0);

if(!n)
cout<<"0! = 1\n";
else
{
cout<<n<<"! = "<<factorial_i(n)<<" - iterativ\n";
cout<<n<<"! = "<<factorial_r(n)<<" - recursiv\n";
}

system("pause");
return (0);
}

1
// Aplicaţia 2. Determinarea lui cmmdc(a,b)

#include<iostream>
using namespace std;

//varianta iterativa
int cmmdc_i(int a, int b)
{
while(a!=b)
{
if(a>b)
a-=b;
else
b-=a;
}
return a;
}

//varianta recursiva
/*
cmmdc(a,b)=|a, daca a=b
|cmmdc(a-b,b), daca a>b
|cmmdc(a,b-a), daca a<b
*/
int cmmdc_r(int a, int b)
{
if(a==b)
return a;
if(a>b)
return cmmdc_r(a-b,b);
return cmmdc_r(a,b-a);
}

int main()
{
int a,b;
cout<<"Introduceti numerele:\n";
cout<<"\ta= ";
cin>>a;
a=abs(a);
cout<<"\tb= ";
cin>>b;
b=abs(b);

int c1,c2;
c1=cmmdc_i(a,b);
c2=cmmdc_r(a,b);

cout<<"CMMDC in varianta iterativa: "<<c1<<'\n';


cout<<"CMMDC in varianta recursiva: "<<c2<<'\n';

system("pause");
return (0);
}

2
// Aplicaţia 3. Determinarea lui cmmdc-ului unui sir de numere intregi

#include<iostream>
using namespace std;

//functia de calcul a cmmdc-ului a doua numere intregi


int cmmdc_2(int a, int b)
{
if(a==b)
return a;
if(a>b)
return cmmdc_2(a-b,b);
return cmmdc_2(a,b-a);
}

//functia de calcul a cmmdc-ului unui sir de numere intregi


int cmmdc_n(int x[], int n) //x - sirul de elemente, n - dimensiunea acestuia
{
if (n==2)
return cmmdc_2(x[0],x[1]);
return cmmdc_2(cmmdc_n(x,n-1),x[n-1]);
/*Explicatie: caz n=3
n=3: return cmmdc_2(cmmdc_n(x,2),x[2]) - x[2] se depoziteaza pe stiva, ca prim
element

n=2: return cmmdc_2(x[0],[1]) - x[0] este al doilea element intrat, x[1]


este al treilea, dar, intre x[0] si x[1] chiar nu conteaza ordinea de intrare in stiva
*/
}

//functia principala in rulare


int main()
{
//declararea vectorului
int x[20],n;

//citirea vectorului
cout<<"Introduceti vectorul dorit\n";
do{
cout<<"\tdati dimensiunea (<=20): ";
cin>>n;
}while(n<2 || n>20);
cout<<"\tdati elementele:\n";
for(int i=0;i<n;i++)
{
cout<<"\t\telementul "<<i+1<<"= ";
cin>>x[i];
}

//determinarea c.m.m.d.c.-ului sirului


cout<<"C.m.m.d.c.-ul sirului citit este: "<<cmmdc_n(x,n)<<'\n';

system("pause");
return (0);
}

3
//Aplicatie 4. Se citeste un sir de numere intregi, si se vor realiza operatii pe
acestea, toate realizate intr-o forma recursiva.

Functii recursive pentru:


- citirea unui de numere intregi
- afisarea sirului
- cmmdc-ul sirului
- suma elementelor
- produsul elementelor
- minimul si maximul
- numarul de nr. strict pozitive si numerele in sine
- numarul de numere pare si numerele in sine
- sortare
*/

#include<iostream>
using namespace std;
#define dim 30
typedef int vector[dim];

//numarul de elemente ca va fi introdus


int NrElemente()
{
int n;
cout << "Introduceti numarul de elemente: ";
cin >> n;
if (n<1 or n>dim)
NrElemente();
return n;
}

//citirea sirului
void citire(vector v, int n, int i)
{
if (i == n)
return;
cout << "Introduceti elementul " << i + 1 << ": ";
cin >> v[i];
citire(v, n, i + 1);
}

//afisarea
void afisare(vector v, int n, int i)
{
if (i == n)
return;
cout << v[i] << ' ';
afisare(v, n, i + 1);
}

//cmmdc
int cmmdc2(int a, int b)
{
if (a == 0)
return b;
if (b == 0)
return a;

4
if (a == 1 or b == 1)
return 1;
if (a == b)
return a;
if (a > b)
return cmmdc2(a - b, b);
return cmmdc2(a, b - a);
}
int cmmdcN(vector v, int n)
{
if (n == 1)
return v[0];
if (n == 2)
return cmmdc2(abs(v[0]), abs(v[1]));
return cmmdc2(cmmdcN(v, n - 1), abs(v[n - 1]));
}

//suma si produsul
int suma(vector v, int n)
{
if (n == 0)
return 0;
return suma(v, n - 1) + v[n - 1];
}
int produs(vector v, int n)
{
if (n == 0)
return 1;
return produs(v, n - 1) * v[n - 1];
}

//media aritmetica a elementelor din sir


float media(vector x, int n, int m)
{
if (n == 1)
return (float)x[0] / m;
else
return (float)x[n - 1] / m + media(x, n - 1, m);
}

//numarul de elemente negative si pozitive (strict, elementele 0 nu se iau in calcul)


struct
{
int neg, poz;
}t;
void negative_pozitive(vector x, int n)
{
int i = n - 1;
if (x[i] > 0)
t.poz++;
else
if (x[i] < 0)
t.neg++;
if (i > 0)
negative_pozitive(x, n - 1);
}

//minimul si maximul

5
int m = INT_MAX, M = INT_MIN;
int minim(vector v, int n)
{
if (n == 0)
return m;
if (v[n - 1] < m)
m = v[n - 1];
return minim(v, n - 1);
}
int maxim(vector v, int n)
{
if (n == 0)
return M;
if (v[n - 1] > M)
M = v[n - 1];
return maxim(v, n - 1);
}

//sortare prin bule


void sortare(vector v, int n)
{
if (n == 0)
return;
for (int i = 0; i < n - 1; ++i)
if (v[i] > v[i + 1])
swap(v[i], v[i + 1]);
sortare(v, n - 1);
}

//functia principala in rulare


int main()
{
int n = NrElemente();
vector v;
citire(v, n, 0);
cout << "Sirul este: "; afisare(v, n, 0);
cout << "\nCmmdc-ul sirului este: " << cmmdcN(v, n);
cout << "\nSuma sirului este: " << suma(v, n) << " , iar produsul: " << produs(v,
n);
cout << "\nMinimul sirului este: " << minim(v, n) << " , iar maximul: " <<
maxim(v, n);
sortare(v, n);
cout << "\nSirul sortat: "; afisare(v, n, 0);
return 0;
}

//Aplicatie 5. Recursivitate indirectă.


Se ve genera un sir dupa urmatorul mod:
- Se citesc primele doua numere din sir
- Fiecare termen impar ulterior celor 2 citite va fi medie aritmetica a
precedentelor
- Fircare termen par ulterior celor citite va fi medie geometrica a precedentelor

#include<iostream>
using namespace std;

float t1, t2;

6
float termen_par(int n);

float termen_imp(int n)
{
if (n != 1)
return (termen_imp(n - 1) + termen_par(n - 1))/2.;
return t1;
}

float termen_par(int n)
{
if (n != 1)
return sqrt(termen_imp(n) *termen_par(n - 1));
return t2;
}

int main()
{
int n;
cout << "Dati primul termen din sir: ";
cin >> t1;
cout << "Dati al doilea termen din sir: ";
cin >> t2;
cout << "Numarul de elemente din sir este: ";
cin >> n;

cout << "Sirul generat va fi: ";


if (n % 2 == 0)
for (int i = 1; i <= n / 2; i++)
cout << termen_imp(i) << ' ' << termen_par(i) << ' ';
else
{
for (int i = 1; i <= n / 2; i++)
cout << termen_imp(i) << ' ' << termen_par(i) << ' ';
cout << termen_imp(n / 2 + 1) << ' ';
}
cout << '\n';

system("pause");
return 0;
}

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