Sunteți pe pagina 1din 12

Probleme recursivitate

1)Factorialul unui numar: #include <iostream> using namespace std; int fact(int n){ if(n==1) return 1; else return n*fact(n-1);} int main(){ int n; cin>>n; cout<<fact(n); return 0;} 2) Sirul lui Fibonacci: 1,1,2,3,5,8,13,21... #include <iostream> using namespace std; int fib(int n){ if(n==1 || n==2) return 1; else return fib(n-1)+fib(n-2);} int main(){ int n; cin>>n; cout<<fib(n); return 0;} 3)Suma primelor n nr impare #include <iostream> using namespace std; int s(int n){ if(n==1) return 1; else return 2*n-1+s(n-1);} int main(){

int n; cin>>n; cout<<s(n); return 0;} 4) 1,5,9,13,17... #include <iostream> using namespace std; int t(int n){ if(n==1) return 1; else return t(n-1)+4;} int main(){ int n; cin>>n; cout<<t(n); return 0;} 5)1+5+9+13...+4n-3 n=40->28 #include <iostream> using namespace std; int t(int n){ if(n==1) return 1; else return 4*n-3+t(n-1);} int main(){ int n; cin>>n; cout<<t(n); return 0;} 6)Suma cifrelor unui nr nat #include <iostream> using namespace std; int s(int n){ if(n==0) return 0;

else return s(n/10)+n%10;} int main(){ int n; cin>>n; cout<<s(n); return 0;} 7)Suma cifrelor pare ale unui nr nat #include <iostream> using namespace std; int s(int n){ if(n==0) return 0; else if(n%2==0) return s(n/10)+n%10; else return s(n/10);} int main(){ int n; cin>>n; cout<<s(n); return 0;} 8)Nr de cifre impare ale unui nr nat #include <iostream> using namespace std; int s(int n){ if(n==0) return 0; else if(n%2!=0) return s(n/10)+1; else return s(n/10);} int main(){ int n; cin>>n;

cout<<s(n); return 0;} 9)a=a*a*a...*a(de n ori) #include <iostream> using namespace std; int putere(int a,int n){ if(n==0) return 1; else return a*putere(a,n-1);} int main(){ int n,a; cin>>n>>a; cout<<putere(n,a); return 0;} 10)Se citeste un vector cu n elemente nr intregi.Sa se determine folosind functii recursive: a)nr componentelor negative din vector; b)produsul elem pare din vector; c)produsul elem de pe pozitiile impare din vector; d)suma elem pare de pe pozitiile divizibile cu k din vector; e)suma patratelor elem ce au cubul mai mic decat k; f) suma nr pozitive si prime din vector; g)nr componentelor impare ale vectorului care apartin intervalului inchis [a,b]; h)de cate ori o componenta a vectorului este media aritmetica a componentelor vectorului. n=8,k=4,a=3,b=8,v={5,8,4,2,-6,15,-7,11} a)2;b)-384;c)840;d)2;e)85;f)18;g)1;h)1. a)int neg(int n,int v[100]){ if(n==0) return 0;//conditia de oprire; else if(v[n]<0) return 1+neg(n-1,v); else return neg(n-1,v);} int main(){ int i,n,v[100]; cin>>n;

for(i=1;i<=n;i++) cin>>v[i]; cout<<neg(n,v);} b)int neg(int n,int v[100]){ int p=1; if(n==0) return 1; else if(v[n]%2==0) return v[n]*neg(n-1,v); else return neg(n-1,v);} int main(){ int i,n,v[100]; cin>>n; for(i=1;i<=n;i++) cin>>v[i]; cout<<neg(n,v);} c) int neg(int n,int v[100]){ int p=1; if(n==0) return 1; else if(n%2!=0) return v[n]*neg(n-1,v); else return neg(n-1,v);} int main(){ int i,n,v[100]; cin>>n; for(i=1;i<=n;i++) cin>>v[i]; cout<<neg(n,v);} d)int neg(int n,int k,int v[100]){ if(n==0) return 0; else if(n%k==0 && v[n]%2==0) return v[n]+neg(n-1,k,v); else

return neg(n-1,k,v);} int main(){ int i,n,k,v[100]; cin>>n>>k; for(i=1;i<=n;i++) cin>>v[i]; cout<<neg(n,k,v);} e) int neg(int n,int k,int v[100]){ if(n==0) return 0; else if(v[n] * v[n]*v[n]<k) return v[n]*v[n]+neg(n-1,k,v); else return neg(n-1,k,v);} int main(){ int i,n,k,v[100]; cin>>n>>k; for(i=1;i<=n;i++) cin>>v[i]; cout<<neg(n,k,v);} f) int prim(int n){ int i; if(n==0) return 0; for(i=2;i<=n/2;i++) if(n%i==0) return 0; return 1;} int neg(int n,int v[100]){ if(n==0) return 0; else if(v[n]>0 && prim(v[n])==1) return v[n]+neg(n-1,v); else return neg(n-1,v);} int main(){ int i,n,v[100]; cin>>n;

for(i=1;i<=n;i++) cin>>v[i]; cout<<neg(n,v);} g) int neg(int n,int a,int b,int v[100]){ if(n==0) return 0; else{ if(v[n]>=a && v[n]<=b && v[n]%2!=0) return 1+neg(n-1,a,b,v); else return neg(n-1,a,b,v);}} int main(){ int i,n,a,b,v[100]; cin>>n>>a>>b; for(i=1;i<=n;i++) cin>>v[i]; cout<<neg(n,a,b,v);} h) int suma(int n,int s,int v[100]){ int i;s=0; for(i=1;i<=n;i++) s=s+v[i]; return s;} int neg(int n,int v[100]){ int s; if(n==0) return 0; else if(v[n]==(suma(n,s,v)/n)) return 1+neg(n-1,v); else return neg(n-1,v);} int main(){ int i,n,v[100]; cin>>n; for(i=1;i<=n;i++) cin>>v[i]; cout<<neg(n,v);} 11)Primele n patrate perfecte

#include<iostream> using namespace std; void f(int n){ if(n>0){ f(n-1); cout<<n*n<<" ";}} int main(){ int n; cin>>n; f(n);} 12)Se citesc n nr nat.Sa se scrie un program care afiseaza toate nr care contin cate 2 cifre pare.(functia recursiva returneaza cate cifre pare are un nr) #include<iostream> using namespace std; int p(int n){ if(n==0) return 0; else if(n%2==0) return 1+p(n/10); else return p(n/10);} int main(){ int n,i,v[100]; cin>>n; for(i=1;i<=n;i++) cin>>v[i]; for(i=1;i<=n;i++) if(p(v[i])==2) cout<<v[i]<<" ";} 13)Se citesc 2 nr n si x si un vector cu n nr intregi.Scrieti o functie recursiva care verifica daca valoarea x exista in vector returnand 1 daca exista si 0 in caz contrar. int v[100]; int f(int n,int x){ if(n>0) if(v[n]==x) return 1; else return f(n-1,x);

else return 0;} int main(){ int i,n,x,p; cin>>n>>x; for(i=1;i<=n;i++) cin>>v[i]; cout<<f(n,x);} 14) Sa se scrie o functie recursiva care returneaza cel mai mic element din vector. #include <iostream> using namespace std; int f(int n,int v[100]){ int y,z; if(v[n]==0) return 9; else{ y=v[n]; z=f(n-1,v); if(y<z) return y; else return z;}} int main(){ int n,v[100],i;cin>>n; for(i=1;i<=n;i++) cin>>v[i]; cout<<f(n,v); return 0;} 15)Sa se realizeze urm doua functii recursive: a)f1 care primeste un nr n si returneaza cifra maxima a lui n; b)f2 care primeste un nr n si returneaza nr de cifre pare ale lui n; c) se citesc n nr nat,sa se afiseze cifra max a fiecarui nr citit si nr care au cel mult 2 cifre pare folosind apeluri ale f1,respectiv f2. #include <iostream> using namespace std; int f1(int n){ int y,z; if(n==0) return 0; else{ y=n%10; z=f1(n/10);

if(y>z) return y; else return z;}} int f2(int n){ if(n==0) return 0; else{ if(n%2==0) return f2(n/10)+1; return f2(n/10);}} int main(){ int n,v[100],i;cin>>n; for(i=1;i<=n;i++) cin>>v[i]; for(i=1;i<=n;i++) cout<<f1(v[i])<<" "; cout<<endl; for(i=1;i<=n;i++) if(f2(v[i])<=2) cout<<v[i]<<" "; return 0;} 16)S1=1-2+3-4+...+n n=1 => S1=1 n=2 => S1=1-4=-3 n=3 => S1=1-4+9=6 n=4 => S1=1-4+9-16=-10 int f1(int n){ if(n==1) return 1; else if(n%2==0) return f1(n-1)-n*n; else if(n%2!=0) return f1(n-1)+n*n;} int main(){ int n;cin>>n; cout<<f1(n);}

17)S2=1*2+ 2*3+3*4+...+n*(n+1) int f2(int n){ if(n==1) return 2; else return f2(n-1)+n*(n+1);} int main(){ int n;cin>>n; cout<<f2(n);} 18)S3=1+1*2+1*2*3+...+1*2*3*..*n int fact(int n){ int i,p; p=1; for(i=1;i<=n;i++) p=p*i; return p;} int f3(int n){ if(n==1) return 1; else return f3(n-1)+ fact(n);} int main(){ int n;cin>>n; cout<<f3(n);} 19)S4=1+4+7+10+...+3*n+1 int f4(int n){ if(n==0) return 1; else return f4(n-1)+ 3*n+1;} int main(){ int n;cin>>n; cout<<f4(n);}

TEST:Tipul I: expresii cu sume,produse; Tipul II: prelucrarea cifrelor,sume de cifre,numarare de cifre(cand trec la cifra urmatoare autoapelez functia f(n/10).Aceasta functie recursiva facuta se va apela in main pt un vector cu n elemente. Tipul III: prelucrarea elem dintr-un vector.Exemplu: suna nr pare dintr-un vector: #include <iostream> using namespace std; int pare(int n,int v[100]){ if(n==0) return 0; else if(v[n]%2==0) return v[n]+pare(n-1,v); else return pare(n-1,v);} int main(){ int n,i,v[100]; cin>>n; for(i=1;i<=n;i++) cin>>v[i]; cout<<pare(n,v);}

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