Sunteți pe pagina 1din 12

Funcții recursive - exemple

1. Scrieti o functie recursiva cu numele cifre care primeste prin parametrul n un numar natual si furnizeaza:
- prin parametrul p numarul format cu cifrele pare ale lui n,
- prin parametrul i numarul format cu cifrele impare ale lui n.
Exemplu:
In urma apelului cifre(4536597,p,i); variabila p va fi egala cu 46, iar i cu 53597.

void cifre(int n, int &p, int &i)


{
if(n<=9) if(n%2==0) { p=n; i=0; }
else { p=0; i=n; }
else
{
cifre(n/10,p,i);
if(n%2==0) p=p*10+n%10;
else i=i*10+n%10;
}
}

2. Sa se scrie o functie recursiva care calculeaza si returneaza diferenta dintre suma elementelor de pe pozitii pare si cea a
celor aflate pe pozitii impare dintr-un vector A primit ca parametru impreuna cu n reprezentand numarul lui de elemente.
Elementele tabloului sunt indexate de la 1.
Exemplu:
Daca functia primeste tabloul A={4,5,6,3,2,9} cu n=6, atunci va returna 5 adica (5+3+9)-(4+6+2).

int dif_poz(int A[], int n)


{
if(n==0) return 0;
else if(n%2==0) return dif_poz(A,n-1)+A[n];
else return dif_poz(A,n-1)-A[n];
}

3. Scrieti o functie recursiva cu numele cifre care primeste prin parametrul n un numar natual si furnizeaza:
- prin parametrul p numarul format cu cifrele pare ale lui n,
- prin parametrul i numarul format cu cifrele impare ale lui n.
Exemplu:
In urma apelului cifre(4536597,p,i); variabila p va fi egala cu 46, iar i cu 53597.

void cifre(int n, int &p, int &i)


{
if(n<=9) if(n%2==0) { p=n; i=0; }
else { p=0; i=n; }
else
{
cifre(n/10,p,i);
if(n%2==0) p=p*10+n%10;
else i=i*10+n%10;
}
}

4. Scrieti o functie recursiva care primeste ca paramentru un numar natural n si returneaza numarul obtinut din n prin
eliminarea cifrelor impare.
Exemplu: daca n=234435, functia returna 244.
Funcții recursive - exemple
int stergimp(int n)
{
if(n==0) return 0;
else if(n%2==1) return stergimp(n/10);
else return stergimp(n/10)*10+n%10;
}

5. 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;
}

6. Se citeste un numar natural n cu cel mult 9 cifre. Afisati numarul de cifre distincte ale lui n. Se vor folosi exclusiv
subprograme recursive.
Exemplu:
Pentru n=38837 se afiseaza 3 (cifrele distinte sunt 3,7 si 8).

#include <iostream>
using namespace std;
Funcții recursive - exemple
int apcif(int n, int c)
{//numarul de aparitii ale lui c in n
if(n<=9) return n==c;
else if(n%10==c) return apcif(n/10,c)+1;
else return apcif(n/10,c);
}

int dist(int n, int c)


{//numara cifrele distincte ale lui n
if(c==-1) return 0;
else if(apcif(n,c)) return dist(n,c-1)+1;
else return dist(n,c-1);
}

int main()
{
int n;
cin>>n;
cout<<dist(n,9);
return 0;
}

sau

#include <iostream>

using namespace std;

int apcif(int n, int c)


{//verific daca c apare in n
if(n<=9) return n==c;
else if(n%10==c) return 1;
else return apcif(n/10,c);
}

int nrdist(int n)
{//numara cifrele distincte ale lui n
if(n==0) return 0;
else if(apcif(n/10,n%10)==0) return nrdist(n/10)+1;
else return nrdist(n/10);
}

int main()
{
int n;
cin>>n;
cout<<nrdist(n);
return 0;
}

7. Se citeste un numar natural n (n<=20). Afisati un desen format din caracterul * ca in exemplul de mai jos. Se vor folosi
exclusiv subprograme recursive.
Exemplu:
Funcții recursive - exemple
Pentru n=3 se afiseaza
*
***
*****
***
*

#include <iostream>
using namespace std;

void linie(int n, char c)


{
if(n>0)
{
linie(n-1,c);
cout<<c;
}
}

void sus(int n, int r)


{
if(r<=n)
{
linie(n-r,' ');
linie(2*r-1,'*');
cout<<endl;
sus(n,r+1);
}
}

void jos(int n, int r)


{
if(r<=n)
{
jos(n,r+1);
linie(n-r+1,' ');
linie(2*r-1,'*');
cout<<endl;
}
}

int main()
{
int n;
cin>>n;
sus(n,1);
jos(n-1,1);
return 0;
}

8. Se citeste un numar natural n. Sa se descompuna ca suma de puteri crescatoare ale lui 2. Se vor folosi doar
prelucrari/calcule realizate cu ajutorul functiilor implementate recursiv.
Exemplu: Pentru n=84 va afisa 4 16 64 (84 se descompune ca 4+16+64)
Funcții recursive - exemple

#include <iostream>
using namespace std;

unsigned int pm2(int n, unsigned int p)


{
if(p*2>n) return p;
else return pm2(n,p*2);
}
void puteri2(int n)
{
if(n>0)
{
unsigned int p=pm2(n,1);
puteri2(n-p);
cout<<p<<" ";
}
}

int main()
{
int n;
cin>>n;
puteri2(n);
return 0;
}

sau

#include <iostream>
using namespace std;

void puteri2(int n, int p)


{
if(n>0)
{
if(n%2==1)
cout<<p<<" ";
puteri2(n/2,p*2);
}
}

int main()
{
int n;
cin>>n;
puteri2(n,1);
return 0;
}

9. 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
Funcții recursive - exemple
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);
Funcții recursive - exemple
is.close();
os.close();
return 0;
}

10. 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;
Funcții recursive - exemple
fin>>n;
citire(a,n);
distict(a,n,b,k);
afis(b,k);
fin.close();
fout.close();
return 0;
}

11. Se citeste un vector cu n elemente numere naturale. Afisati elementele care sunt numere factoriale.
Se vor folosi functii recursive pentru toate prelucrarile necesare.
Ex: 6
1 3 7 6 24 100
se vor afisa numerele 1 6 24

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

int ok(int x, int n)


{
if(x==1) return 1;
else if(x%n!=0) return 0;
else return ok(x/n, n+1);
}

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


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

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


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

int main()
{
int n,a[100];
fin>>n;
citire(n,a);
afis(n,a);
fin.close();
fout.close();
Funcții recursive - exemple
return 0;
}

12. Sa se calculeze recursiv de cate ori apare o valoare intreaga x intr-un vector a cu n elemente intregi.

#include<iostream>
using namespace std;

int a[100],n,x;

int nrap(int n, int x)


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

int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
cin>>x;
cout<<nrap(n,x);
system("pause");
return 0;
}

13. Sa se calculeze recursiv suma 1*2 + 2*3 + ... + n*(n+1).

#include<iostream.h>
using namespace std;

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

int main()
{
cout<<suma(3);
system("pause");;
return 0;
}

14. Sa se calculeze recursiv suma 1 + 1/2 + 1/3 + ... +1/n.

#include<iostream.h>

using namespace std;

float suma(int n)
{ if (n==0) return 0;
else return suma(n-1) + 1.0/n;
}
Funcții recursive - exemple

int main()
{
cout<<suma(5);
system("pause");;
return 0;
}

15. Sa se scrie o functie recursiva care primeste un parametru n numar natural si afiseaza:
1 2 3 4 ... n
...
123
12
1

#include<iostream>
using namespace std;

void afis(int n)
{ if(n>0)
{
for(int i=1;i<=n;i++) cout<<i<<" ";
cout<<endl;
afis(n-1);
}
}

int main()
{
afis(6);
return 0;
}

16. Sa se scrie o functie recursiva care primeste un parametru n numar natural si afiseaza:
1 2 3 4 ... n
...
123
12
1

#include<iostream>
using namespace std;

void afis(int n)
{ if(n>0)
{
for(int i=1;i<=n;i++) cout<<i<<" ";
cout<<endl;
afis(n-1);
}
}

int main()
{
Funcții recursive - exemple
afis(6);
return 0;
}

17. Sa se scrie o functie recursiva pentru calculul primei cifre a unui numar natural.

#include<iostream>
using namespace std;

int PC(int n)
{
if ( n <= 9 ) return n;
else
return PC(n/10);
}

int main()
{
cout << PC(2405);
system("pause");
return 0;
}

18. Sa se determine cifra maxima a unui numar natural folosind o functie recursiva.

#include<iostream>

using namespace std;

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

int main()
{
cout << max(23614);
system("pause");
return 0;
}

19. 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)
Funcții recursive - exemple
if(n%d==0) { cout<<d<<" ";
desc(n/d,d);
}
else desc(n,d+1);
}
void main()
{
desc(234,2);
}

20. Sa se scrie o functie recursiva care primeste 3 parametri: n - numar natural, c1,c2 cifre si returneaza numarul obtinut
din n prin inlocuirea tuturor aparitiilor cifrei c1 cu c2.
Ex. din n=2324, c1=2 si c2=5 returneaza 5354

#include<iostream.h>

long schimba(long n, int c1, int c2)


{ if(n==0) return 0'
else if(n%10==c1) return schimba(n/10,c1,c2)*10+c2;
else return schimba(n/10,c1,c2)*10+n%10;
}
void main()
{
cout<<schimba(23362,2,4);
}

21. Sa se scrie o functie recursiva care primeste un parametru n numar natural si returneaza numarul obtinut din n prin
scaderea cu 1 a cifrelor impare si marirea cu 1 a celor pare.
Ex. din n=2324 returneaza 3235

#include<iostream.h>

long schimba(long n)
{ if(n==0) return 0;
else if(n%2==1) return schimba(n/10)*10+n%10-1;
else return schimba(n/10)*10+n%10+1;
}
void main()
{
cout<<schimba(23362);
}

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