Vous êtes sur la page 1sur 8

Recursivitate

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

2. Sa se calculeze CMMDC al doua numele naturale folosind o functie recursiva.


#include<iostream>
using namespace std;

int cmmdc(int x, int y)


{ if(x%y==0) return y;
else return cmmdc(y,x%y);
}
int main(){
cout<<cmmdc(15,55);
system("pause");
return 0;}

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

4. Sa se scrie o functie recursiva pentru calculul rasturnatului unui numar natural.


using namespace std;

int rast(int n, int r)


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

int main(){
cout <<rast(23456,0);
system("pause");
return 0;
}

5. Sa se scrie o functie recursiva care calculeaza cate cifre are un numar natural.

#include<iostream>
using namespace std;

int NC(int n){


if ( n <= 9 ) return 1;
else
return NC(n/10)+1;}

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

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

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

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

8. Sa se calculeze recursiv suma


1/1 + 2/2 + 3/3 + 5/4 + 8/5 + ... + fib(n)/n
unde fib(n) este al n-lea termen din sirul lui Fibonacci.
#include<iostream.h>

using namespace std;

int fib(int n)
{ if(n==1 || n==2) return 1;
else return fib(n-1)+fib(n-2);}
float suma(int n)
{ if (n==0) return 0;
else return suma(n-1) + (float)fib(n)/n;}

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

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

10. Sa se calculeze recursiv 2 la puterea n.


#include<iostream>

using namespace std;

int putere(int n){


if(n==0) return 1;
else return putere(n-1)*2;}

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

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

12. Sa se scrie o functie recursiva care numara cate vocale mici are un cuvant transmis ca
parametru.
#include<iostream>

using namespace std;

int vocale(char s[20]){


if(strlen(s)==0) return 0;
else if(strchr("aeiou",s[0])) return 1 + vocale(s+1);
else return vocale(s+1);}

int main(){ cout<<vocale("anamaria");


return 0;}

13. Sa se calculeze recusiv suma


S=1/2+2/1+2/3+3/2+...+n/(n+1)+(n+1)/n.
#include<iostream>

using namespace std;

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

int main(){ int n;


cin>>n;
cout<<suma(n);
system("pause");
return 0;}
14. 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;}

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

16.Sortare cu metoda selectiei (metoda elevului) - implementare recursiva (tabloul este


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

void elev_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) elev_rec(a,n,i,j+1);
else elev_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];
elev_rec(a,n,0,1);
for(int i=0;i<n;i++)
os<<a[i]<<" ";
is.close();
os.close();
return 0;}

Vous aimerez peut-être aussi