You are on page 1of 8

Exemple de algoritmi - Recursivitate

1.
Citirea si afisarea unei matrici folosind functii recursive.
#include <iostream>
using namespace std;

void citire(int A[][101], int n, int m, int i, int j)


{
if(i<=n)
{
cin>>A[i][j];
if(j<m) citire(A,n,m,i,j+1);
else citire(A,n,m,i+1,1);
}
}

void afisare(int A[][101], int n, int m, int i, int j)


{
if(i<=n)
{
cout<<A[i][j]<<" ";
if(j<m) afisare(A,n,m,i,j+1);
else
{
cout<<endl;
afisare(A,n,m,i+1,1);
}
}
}

int main()
{
int A[101][101],n,m;
cin>>n>>m;
citire(A,n,m,1,1);
afisare(A,n,m,1,1);
return 0;
}

2.
Sortare cu metoda selectiei - implementare recursiva (tabloul este indexat incepand cu 0)

#include <fstream>
using namespace std;
ifstream is("date.in");
ofstream os("date.out");

void rec(int a[], int n, int i, int j)


{
if(i<n-1)
{
if(a[i]>a[j]) {int aux=a[i]; a[i]=a[j]; a[j]=aux;}
if(j<n-1) rec(a,n,i,j+1);
else rec(a,n,i+1,i+2);
}
}

int main()
{
int a[100],n;
is>>n;
for(int i=0;i<n;i++)
is>>a[i];
rec(a,n,0,1);
for(int i=0;i<n;i++)
os<<a[i]<<" ";
is.close();
os.close();
return 0;
}

3.
Sortare cu metoda bulelor - implementare recursiva (tabloul este indexat incepand cu 0)

#include <fstream>
using namespace std;
ifstream is("date.in");
ofstream os("date.out");

void bule_rec(int a[], int n)


{
int gata=1;
for(int i=0;i<n-1;i++)
if(a[i]>a[i+1])
{
int aux=a[i]; a[i]=a[i+1]; a[i+1]=aux;
gata=0;
}
if(!gata) bule_rec(a,n-1);
}

int main()
{
int a[100],n;
is>>n;
for(int i=0;i<n;i++)
is>>a[i];
bule_rec(a,n);
for(int i=0;i<n;i++)
os<<a[i]<<" ";
is.close();
os.close();
return 0;
}

4.
Implementati in mod recursiv algoritmul de sortare prin insertie.

#include<fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");

void sort(int a[100], int n)


{
if(n>1)
{
sort(a,n-1);
int i=n,aux;
while(a[i]<a[i-1] && i>1)
{ aux=a[i];
a[i]=a[i-1];
a[i-1]=aux;
i--;
}
}
}

int main()
{
int a[100], n,i;
fin>>n;
for(i=1;i<=n;i++) fin>>a[i];
sort(a,n);
for(i=1;i<=n;i++) fout<<a[i]<<" ";
fin.close();
fout.close();
return 0;
}

5.
Se citeste un vector a cu n elemente numere intregi. Construiti si afisati doi vectori b si c contruiti
astfel:
- vectorul b contine elementele pare din vectorul a
- vectorul c contine elementele impare din vectorul a
Se vor folosi functii recursive pentru citire si afisare, precum si pentru construirea celor doi vectori
ceruti.
Exemplu:
date.in
7
2579254
date.out
224
5795

#include <fstream>
using namespace std;

ifstream is("date.in");
ofstream os("date.out");

void citire(int a[], int n)


{
if(n>0)
{
citire(a,n-1);
is>>a[n];
}
}

void afisare(int a[], int n)


{
if(n>0)
{
afisare(a,n-1);
os<<" "<<a[n];
}
}

void split(int a[],int n,int b[],int &m,int c[],int &k)


{
if(n>0)
{
split(a,n-1,b,m,c,k);
if(a[n]%2==0)
b[++m]=a[n];
else
c[++k]=a[n];
}
}

int main()
{
int a[200],b[100],c[100],n,m=0,k=0;
is>>n;
citire(a,n);
split(a,n,b,m,c,k);
afisare(b,m);
os<<endl;
afisare(c,k);
is.close();
os.close();
return 0;
}

6.
Scrieti o functie recursiva care sterge elementul de la pozitia i dintr-un vector. Vectorul, numarul de
elemente si pozitia i se transmit ca parametri.

void del(int a[100], int &n, int i)


{
if(i==n) n--;
else
{ a[i]=a[i+1];
del(a,n,i+1);
}
}

7.
Se citeste un vector a cu n elemente numere intregi. Construiti un vector b care sa contina elementele
distincte din vectorul a. Toate prelucrarile vor fi realizate folosind functii recursive.

#include<fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");

void citire(int a[100], int n)


{
if(n>0)
{
citire(a,n-1);
fin>>a[n];
}
}

void afis(int a[100], int n)


{
if(n>0)
{
afis(a,n-1);
fout<<a[n]<<" ";
}
}

int cauta(int a[100], int n, int k)


{
if(n==0) return 0;
else if(a[n]==k) return 1;
else return cauta(a,n-1,k);
}

void distict(int a[100], int n, int b[100], int &k)


{
if(n>0)
{
distict(a,n-1,b,k);
if(!cauta(b,k,a[n]))
{
k++;
b[k]=a[n];
}
}
}

int main()
{
int a[100],b[100],k=0, n;
fin>>n;
citire(a,n);
distict(a,n,b,k);
afis(b,k);
fin.close();
fout.close();
return 0;
}

8.
Sa se stearga din fiecare element al unui vector toate aparitiile cifrei maxime. Se vor folosi functii
recursive pentru urmatoarele prelucrari:
- citirea elementelor vectorului
- determinarea cifrei maxime a unui numar
- stergerea tuturor aparitiilor unei cifre dintr-un numar
- parcurgerea vectorului si modificarea elementelor conform cerintei
- afisarea vectorului
Ex: 7
37 443 13 160 31 11 140
se vor afisa valorile: 3 3 1 10 1 0 10

#include<fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");

int cmax(int n)
{
if(n<=9) return n;
else if(cmax(n/10)>n%10) return cmax(n/10);
else return n%10;
}

int delcif(int n, int c)


{
if(n==0) return 0;
else if(n%10==c) return delcif(n/10,c);
else return delcif(n/10,c)*10+n%10;
}

void s(int a[100], int n)


{
if(n>0)
{
s(a,n-1);
a[n]=delcif(a[n],cmax(a[n]));
}
}

void citire(int a[100], int n)


{
if(n>0)
{
citire(a,n-1);
fin>>a[n];
}
}

void afis(int a[100], int n)


{
if(n>0)
{
afis(a,n-1);
fout<<a[n]<<" ";
}
}

int main()
{
int a[100],n;
fin>>n;
citire(a,n);
s(a,n);
afis(a,n);
fin.close();
fout.close();
return 0;
}

9.
Se citeste un vector cu n elemente numere naturale folosind o functie recursiva. Sa se calculeze suma
tuturor cifrelor din care sunt formate elementele vectorului folosind doar functii recursive.

#include<iostream>

using namespace std;


int n, a[100];
void citire(int a[100], int n)
{
if(n>0)
{ citire(a,n-1);
cin>>a[n];
}
}

int sumacif(int n)
{
if(n==0) return 0;
else return n%10+sumacif(n/10);
}

int suma(int a[100], int n)


{
if(n==0) return 0;
else return
suma(a,n-1)+sumacif(a[n]);
}

int main()
{
cin>>n;
citire(a,n);
cout<<suma(a,n);
return 0;
}

10.
Sa se scrie o functie recursiva care sa afiseze descompunerea in factori primi a unui numar natural.

#include<iostream.h>

void desc(int n, int d)


{ if(n>1)
if(n%d==0) { cout<<d<<" ";
desc(n/d,d);
}
else desc(n,d+1);
}
void main()
{
desc(234,2);
}

11.
Sa se scrie o functie recursiva care calculeaza si returneaza suma cifrelor unui numar natural primit ca
parametru.

#include<iostream.h>

int sumacif(long n)
{ if(n==0) return 0;
else return sumacif(n/10)+n%10;
}
void main()
{
cout<<sumacif(23562);
}

12.
Se citeste un vector a cu n elemente numere naturale. Sa se calculeze elementul maxim din vector. Se
va folosi o functie recursiva pentru citire si una recursiva pentru determinarea elementului maxim.

#include<iostream>

using namespace std;

int max(int a[100], int i, int j)


{
if(i==j) return a[i];
else { int m=(i+j)/2;
int m1=max(a,i,m);
int m2=max(a,m+1,j);
if(m1<m2) return m2;
else return m1;
}
}

void citire(int a[100], int n)


{
if(n>0) { citire(a,n-1);
cin>>a[n];
}
}

void afis(int a[100],int n)


{
if(n>0) { afis(a,n-1);
cout<<a[n]<<" ";
}
}

int main()
{
int n,a[100];
cin>>n;
citire(a,n);
afis(a,n);
cout<<max(a,1,n);
system("pause");
return 0;
}

13.
Sa se calculeze recursiv suma primelor n patrate perfecte.

#include<iostream>

using namespace std;


int suma(int n)
{
if(n==0) return 0;
else return suma(n-1)+n*n;
}

int main()
{
int n;
cin>>n;
cout<<suma(n);
system("pause");
return 0;
}

You might also like