Recursive C++
Recursive C++
#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();
return 0;
}
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;
}
#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;
}
#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;
}
Descompuneti un numar natural n ca suma de termeni din sirul lui Fibonacci. Scrieti functii recursive
pentru toate prelucrarile necesare.
Ex: 80 se descompune ca 55+21+3+1
#include<fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int fib(int n)
{
if(n==0 || n==1) return 1;
else return fib(n-1)+fib(n-2);
}
int fibm(int i, int n)
{
if(fib(i)>n) return fib(i-1);
else return fibm(i+1,n);
}
void gen(int n)
{
if(n>0)
{
int f=fibm(1,n);
fout<<f<<" ";
gen(n-f);
int main()
{
int n;
fin>>n;
gen(n);
fin.close();
fout.close();
return 0;
}
Se citeste un vector a cu n elemente numere naturale. Inlocuiti fiecare element din vector cu suma
cifrelor care au aceeasi paritate cu pozitia elementului. Se vor folosi functii recursive pentru toate
prelucrarile.
Ex: 4
23 332 123 54
se vor afisa valorile: 3 2 4 4
#include<fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int spar(int n)
{
if(n==0) return 0;
else if(n%2) return spar(n/10)+n%10;
else return spar(n/10);
}
int simp(int n)
{
if(n==0) return 0;
else if(n%2==0) return simp(n/10)+n%10;
else return simp(n/10);
}
void s(int a[100], int n)
{
if(n>0)
{
s(a,n-1);
if(n%2) a[n]=spar(a[n]);
else a[n]=simp(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;
}
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.
#include<fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
float proc0(int a[100][100], int n, int i, int j, int nz, int nc)
{
int x;
if(i==n) return 100.0*nz/nc;
else
{
if(a[i][j]==0) {nz++; nc++;}
else
{
x=a[i][j];
while(x>0)
{
if(x%10==0) nz++;
nc++;
x=x/10;
}
}
if(j!=n) return proc0(a,n,i,j+1,nz,nc);//merge indreapta pe linie
else if(i<(n+1)/2) return proc0(a,n,i+1,n+1-i,nz,nc);//merge in
dreapta diag. sec
else return proc0(a,n,i+1,i+2,nz,nc); //merge in dreapta siag.
princ.
}
}
int main()
{
int n,i,j,a[100][100];
fin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
fin>>a[i][j];
fout<<proc0(a,n,2,n,0,0)<<"%";
fin.close();
fout.close();
return 0;
}
Se citeste un numar natural n si apoi un tablou a cu n elemente naturale. Inlocuiti fiecare element
din tablou cu cel mai apropiat numar palindrom si afisati tabloul astfel obtinut.
Se vor scrie si folosi functii recursive pentru urmatoarele operatii:
- citirea celor n elemente ale tabloului a
- afisare celor n elemente ale tabloului a
- calculul rasturnatului unui numar natural
- calcularea celui mai mic palindrom mai mare sau egal cu n
- calcularea celui mai mare palindrom mai mic sau egal cu n
- parcurgerea tabloului si efectuarea modificarii cerute
Exemplu:
n=5
elementele tabloului a: 45 306 118 12 3113
rezultatul va fi: 44 303 121 11 3113
#include <fstream>
using namespace std;
ifstream is("date.in");
ofstream os("date.out");
os.close();
return 0;
#include <iostream>
using namespace std;
int rast(int n, int r)
{
if(n==0) return r;
else return rast(n/10,r*10+n%10);
}
void desc(int x, int i)
{
if(i<=x/2)
{
if(i+rast(i,0)==x) cout<<i<<"+"<<rast(i,0)<<endl;
desc(x,i+1);
}
}
int main()
{
int x;
cin>>x;
desc(x,1);
return 0;
}
(544 apare de numar maxim de ori si e inlocuit cu suma primelor doua cifre ale sale, adica cu 9)
#include <fstream>
using namespace std;
ifstream is("date.in");
ofstream os("date.out");
void citire(int a[], int n) //citeste elementele vectorului
{
if(n>0)
{
citire(a,n-1);
is>>a[n];
}
}
void afisare(int a[], int n) //afiseaza elementele vectorului
{
if(n>0)
{
afisare(a,n-1);
os<<" "<<a[n];
}
}
int sc(int n)//calculeaza suma primelor doua cifre ale lui n
{
if(n<100) return n/10+n%10;
else return sc(n/10);
}
int ap(int a[],int n,int x)//determina de cate ori apare x in vectorul a cu
n elemente
{
if(n==0) return 0;
else if(a[n]==x) return 1+ap(a,n-1,x);
else return ap(a,n-1,x);
}
int maxim(int a[],int n)//determina elementul care apare de cele mai multe
ori in a
{
if(n==0) return 0;
else {
int m=maxim(a,n-1);
if(ap(a,n,a[n])>ap(a,n,m)) return a[n];
else return m;
}
}
void schimba(int a[],int n,int m)//schimba in a elementele care sunt egale
cu m cu suma cifrelor lor
if(n>0)
{
schimba(a,n-1,m);
if(a[n]==m) a[n]=sc(a[n]);
}
int main()
{
int a[100],n;
is>>n;
citire(a,n);
schimba(a,n,maxim(a,n));
afisare(a,n);
is.close();
os.close();
return 0;
}
Se citeste un numar natural n si apoi un vector a cu n elemente naturale. Stergeti din vectorul a
toate aparitiile elementului minim
Se vor scrie si folosi functii recursive pentru urmatoarele operatii:
- citirea celor n elemente ale vectorului a
- afisare celor n elemente ale vectorului a
- gasirea elementului minim al vectorului
- stergerea elementului de la o pozitie i dintr-un vector
- stergerea tuturor aparitiilor elementului minim
Exemplu:
date.in
8
12315618
date.out
23568
(1 este elementul minim si este sters de 3 ori)
#include <fstream>
using namespace std;
ifstream is("date.in");
ofstream os("date.out");
void citire(int a[], int n) // citeste elementele vectorului
{
if(n>0)
{
citire(a,n-1);
is>>a[n];
}
}
void afisare(int a[], int n) //afiseaza elementele vectorului
{
if(n>0)
{
afisare(a,n-1);
os<<" "<<a[n];
}
}
int minim(int a[],int n) //returneaza minimul din vector
{
if(n==1) return 1;
else return min(a[n],minim(a,n-1));
}
void del(int a[], int &n, int i) //sterge pozitia i
{
if(i==n) n--;
else
{ a[i]=a[i+1];
del(a,n,i+1);
}
}
void delmin(int a[], int &n, int i) //sterge toate aparitiile elementului
minim
{
if(i>0)
{
delmin(a,n,i-1);
if(a[i]==minim(a,n)) del(a,n,i);
}
}
int main()
{
int a[100],n;
is>>n;
citire(a,n);
delmin(a,n,n);
afisare(a,n);
is.close();
os.close();
return 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;
}
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;
}
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];
}
}
a) Scrieti o functie recursiva cifra cu doi parametri n si c unde n e numar natural, iar c este o cifra si
care returneaza de cate ori apare cifra c printre cifrele numarului n.
b) Scrieti o functie recursiva cifre cu trei parametri a, n si c unde a e un vector cu cel mult 100 de
elemente numere naturale, n e numar natural reprezentand numarul de elemente din vectorul a, iar
c este o cifra si care returneaza de cate ori apare cifra c in total in cele n numere din vectorul a (va
folosi functia cifra).
c) Se citeste un numar n si un vector a cu n elemente numere naturale. Folosind functia cifre
determinati si afisati cifrele care apar de un numar maxim de ori in numerele din vectorul a.
Exemplu: n=6, a={7, 9, 373, 127, 733, 661} => 3 7
#include <iostream>
using namespace std;
int cifra(int n, int c)
{
if(n<10) return n==c;
else if(n%10==c) return 1+cifra(n/10,c);
else return cifra(n/10,c);
}
int cifre(int a[], int n, int c)
{
if(n==0) return 0;
else return cifre(a,n-1,c)+cifra(a[n],c);
}
int main()
{
int n,a[101],c,map=0;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(c=0;c<=9;c++)
if(cifre(a,n,c)>map) map=cifre(a,n,c);
for(c=0;c<=9;c++)
if(cifre(a,n,c)==map) cout<<c<<" ";
return 0;
}
a) Scrieti o functie recursiva litera cu doi parametri s si c unde s e un cuvant, iar c este o litera si
care returneaza de cate ori apare litera c in cuvantul s.
b) Scrieti o functie recursiva litere cu trei parametri s, n si c unde s e un vector ce memoreaza cel
mult 20 de cuvinte, n e numar natural reprezentand numarul de cuvinte din vectorul s, iar c este o
litera si care returneaza de cate ori apare litera c in total in cele n cuvinte din vectorul s (va folosi
functia litera).
c) Se citeste un numar n si un vector s de n cuvinte. Folosind functia litere, determinati si afisati
literele care apar de un numar maxim de ori in cuvintele din vectorul s.
Exemplu: n=3, s={"ana", "are", "mere"} => a e
#include <iostream>
#include <cstring>
using namespace std;
int litera(char s[21], char c)
{
if(strlen(s)==0) return 0;
else if(s[0]==c) return 1+litera(s+1,c);
else return litera(s+1,c);
}
int litere(char s[21][21], int n, char c)
{
if(n==0) return 0;
else return litera(s[n],c)+litere(s,n-1,c);
}
int main()
{
char s[21][21],map=0;
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>s[i];
for(char c='a';c<='z';c++)
if(litere(s,n,c)>map) map=litere(s,n,c);
for(char c='a';c<='z';c++)
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)
#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;
}