Sunteți pe pagina 1din 6

Probleme subprograme recursive

Recursivitatea poate fi directa sau indirecta :

In Recursivitatea directa există un singur proces care se autoapeleayă, pe baza unei condiţii. Astfel, dacă în corpul
funcţiei F se întâlneşte apelul aceleiaţi funcţii F, înseamnă ca avem o recursivitate directă.
In recursivitatea indirectă există două procese care se apelează reciproc astfel: funcţia F apelează funcţia G iar
funcţia G apelează funcţia F, ceea ce ănseamnă că subprogramele sunt indirect recursive. În această situaţie este
obligatoriu să declarăm funcţiile prin prototipul lor.
Pentru funcţiile f şi g definite mai jos, scrieţi care este rezultatul returnat la apelulg(11).
Dar rezultatul returnat la apelul f(6)?
long f(int c)
long g(long x)
{ if (c<1)
{ if (x>9)
return 1;
return (x/10 + x%10);
else
else
return g(c+f(c­1));
return x;
}

1) Realizati un program pentru funcţia Ackermann unde m şi n numere naturale date.

ac(m,n)= n+1, daca m=0


Ex: ac(4,3)=253
ac(m-1,1) daca n=0

ac(m-1,ac(m,n-1)) altfel

2) Să se scrie un program care determină cel mai mare divizor comun a 2 numere întregi x şi y folosind următoarele
proprietăţi, algoritmul lui Euclid:

cmmdc(x,y)= cmmdc(x-y,y), daca x>y


Exemplu: cmmdc(13455, 12435)=15
cmmdc(x,y-x), daca y>x

x , daca x=y

3) Să se scrie câte o funcţie recursivă pentru calculul următoarelor expresii:


a) Sa= 1 + 2+ 3+ … + n Ex: n=10 se obtine 55
b) Sb= 1+ 3+…+(2n-1) Ex: n=10 se obtine 100
c) Pc=1*2*3*…*n Ex n=5 se obtine 120
d) Pd=2*4*6*…*(2n) Ex pt n= 5 se obtine 3840
4) Să se scrie cîte o funcţie recursivă pentru a calcula:
a) Suma cifrelor unui număr natural citit de la tastatură. Ex: pt n=2345 obţinem suma 14.
b) Produsul cifrelor unui număr natural citit de la tastatură. Ex: pt n= 2345 obţinem produsul 120
c) Numărul de apariţii al unei cifre date într-un număr dat. Ex: pt n= 2131 şi cifra= 1 se obţine 2
d) Suma cifrelor pare. Ex: pt n= 2134 se obţine 8
5) Se dă un vector cu n numere intregi. Să se determine folosind funcţii recursive:
e) Dacă elementele vectorului dat sunt dispuse simetric faţă de jumătatea sa.
f) Maximul elementelor din vector
g) Minimul elementelor din vector
h) Dacă vectorul conţine cel puţin un element pozitiv
i) Suma elementelor pare
j) Produsul elementelor impare
k) Câte elemente prime conţine
Ex: n=6, (1, 12,-1,-1, 12, 1)
a) este simetric, b) maximul = 12, c) minimul = -1, d) da, e) 24, f) 1, g) 0.
Probleme subprograme recursive
Itemii următori sunt preluaţi din variantele de 8. Pentru definiţia alăturată a subprogramului f, ce
bacalaureat 2009. valoare are f(3)? Dar f(8)?
1. Se consideră subprogramul f definit alăturat. Ce int f(int x)
valoare are f(250)? {
int f(int x) if(x<=4) return x*x­3;
{ return f(x­3)+4;
if(x%3==0) return 0; }
else return 1+f(x/3); 9. Pentru definiţia alăturată a subprogramului sc,
} stabiliţi ce valoare are sc(10). Darsc(901324)?
2. Se consideră subprogramul f definit alăturat. Ce int sc(long x)
valoare are f(5)? Dar f(100)? {
long f(int n) if(x<10) return x;
{ return sc(x/10)+x%10;
if(n<0) return 0; }
else return f(n­2)+n; 10. Considerăm subprogramul f definit alăturat. Ce
} valoare are f(7,11)? Dar f(11,7)?
3. Funcţia f are definiţia alăturată. Dacă f(x) are int f(int x,int y)
valoarea 10100, care este valoarea lui x? {
long f(int n) if(x<=y) return x­y;
{ return f(y­x,x­1)+3;
if(n<=0) return 0; }
else return f(n­1)+2*n; 11. Subprogramul scif returnează suma cifrelor
} unui număr natural transmis ca parametru.
4. Subprogramul f are definiţia alăturată. Ce Care este valoarea expresiei
valoare are f(4)? Dar f(11)? scif(scif(518)+scif(518))?
int f(int x) 12. Se consideră definit subprogramul f .
{if(x<1)return 1; Scrieţi două valori naturale, x1 şi x2
else return f(x­3)+1; (x1≠x2, x1<12 şi x2<12) pentru caref(x1)=f(x2).
5. Subprogramul f are definiţia alăturată. Ce int f(int i)
valoare are f(6,5)? Dar f(5,10)? {
int f(int x,int y) if (i>12) return 1;
{if(x==y)return x; else return 1+f(i+2);
else if(x<y)return f(x+1,y­1); }
else return f(x­1,y); 13. Subprogramul re este definit alăturat. Ce
} valoarea are re(1)? Dar re(14)?
6. Subprogramul f are definiţia alăturată. Ce int re(int i)
valoare are f(3)? Dar f(10)? {if (i<9) return 3+re(i+2);
int f(int x) else
{if(x==0)return 0; if (i==9) return ­2;
else return f(x­1)+2;} else return 1+re(i­1);}
14. Subprogramul f este definit alăturat.
7. Subprogramul f are definiţia alăturată. Ce Ce valoare are f(8,4)?
valoare are f(7)? Dar f(100)? int f (int x,int y)
int f(int x) {
{if(x%6==0)return x; if(x<y)return 1+f(x+1,y);
else return f(x­1); if(y<x)return 1+f(y+1,x);
} return 1;
}
Probleme subprograme recursive
21. Funcţia F are definiţia alăturată. Ce valoare
15. Funcţia f are definiţia alăturată: are F(3)?
a) Ce valoare are f(16)? int F(int n)
b) Scrieţi cea mai mare valoare de două cifre pe {if(n==0 || n==1) return 1;
care o poate avea n astfel încât f(n)să fie egal cu 2. else
int f(int n) return 2*F(n­1)+2*F(n­2);}
{ if (n<=0) return ­1; 22. Pentru funcţiile f şi g definite mai jos, scrieţi
if (n%2==0) return 0; care este rezultatul returnat la apelulg(11).
if (n%3==0) return 0; Dar rezultatul returnat la apelul f(6)?
return 1+f(n­10); long g(long x)
} { if (x>9)
16. Funcţia f are definiţia alăturată. return (x/10 + x%10);
a) Ce valoarea are f(17)? else
b) Ce valoare are f(22)? return x;
int f(int n) }
{if (n<=9) return 0;
if (n%4==0) return 0; long f(int c)
return 1+f(n­3); { if (c<1)
} return 1;
17. Pentru subprogramul suma definit alăturat, else
scrieţi valoarea expresiei suma(5,4). return g(c+f(c­1));
int suma (int a,int b) }
{ if (a==0 && b==0) return 0; 23. Pentru funcţiile f1 şi f2 definite alăturat,
else if (a==0) return 1+suma(a,b­1); stabiliţi care este valoarea lui f1(3).
else return 1+suma(a­1,b); Darf2(41382)?
} long f1(int c)
18. Se consideră subprogramul, f, definit alăturat. { if (c%2==1) return 1;
a. Ce valoare are f(100)? else return 2;
b. Scrieţi o valoare pentru x astfel încât f(x)=1 }
int f(int n) long f2(long n)
{ if(n==0) return 0; { if (n==0) return 0;
else return n%2+f(n/2); else return f1(n%10)+f2(n/10);
} }
19. Funcţia F are definiţia alăturată. Ce valoare 24. Pentru funcţia f definită alăturat, stabiliţi care
are F(5)? este valoarea f(5). Dar f(23159)?
int F(int x) int f(int n){
{if(x!=0) return x+F(x­1); int c;
else if (n==0) return 9;
return x; else
} {c=f(n/10);
20. Funcţia F are definiţia alăturată. Ce valoare if (n%10<c) return n%10;
are F(18)? else return c;
int F(int x){ }
if (x<=1) return x; }
else return x+F(x­2);
}
Probleme subprograme recursive
25. Se consideră subprogramul cu definiţia 30. Pentru definiţia alăturată a subprogramului f,
alăturată. Ce valoare are f(3,1)? ce se afişează ca urmare a apeluluif(26);?
int f(int n,int y) void f (int x)
{ if(n!=0) {if(x>0)
{ y=y+1; if(x%4==0)
return y+f(n­1,y); { cout<<’x’;
} f(x­1); }
else return 0; else
} { f(x/3);
cout<<’y’; }}
26. Se consideră subprogramul f cu definiţia
alăturată. Ce valoare are f(1213111,1)? 31. Pentru definiţia alăturată a subprogramului f, ce
int f (long n, int k){ se afişează ca urmare a apeluluif(15,2);?
if (n!=0) void f (int n, int x)
if(n%10==k) { if(x>n)
return 1+f(n/10,k); cout<<0;
else return 0; else
else return 0;} if(x%4<=1) f(n,x+1);
else
27. Se consideră subprogramul alăturat: { f(n,x+3);
int f(int a, int b) cout<<1;
{if (b<1) return ­1; }}
else 32. Pentru subprogramul f definit mai jos, ce
if (a%b==0) se afişează ca urmare a apeluluif(3,17)?
return 1+f(a/b,b); void f ( int a, int b)
else { if(a<=b)
return 0; } { f(a+1,b­2); cout<<’*’;}
Ce valoare are f(15,2)? Dar f(128,2)? else cout<<b;
}
28. Pentru definiţia de mai jos a subprogramului f, 33. Se consideră subprogramul f definit alăturat.
ce se afişează ca urmare a apelului f(121,1);? Ce se va afişa în urma apeluluif(12345);?
void f(long n, int i) void f(long int n)
{ if(n!=0) { if (n!=0)
if(n%3>0) {if (n%2 == 0)
{ cout<<i; f(n/3,i+1); } cout<<n%10;
} f(n/10);
}}
29. Pentru definiţia de mai jos a subprogramului f, 34. Se consideră subprogramul f, descris alăturat.
ce se afişează ca urmare a apelului f(12345);? Ce se va afişa în urma apeluluif(3);?
void f(long n) void f(int n)
{ cout<<n%10; { if (n!=0)
if(n!=0) { if (n%2==0)
{ f(n/100); cout<<n%10;} cout<<n<<’ ’;
} f(n­1);
cout<<n<<’ ’;
}
else cout<<endl;
}
Probleme subprograme recursive
41. Ce se afişează ca urmare a
35. Subprogramul f are definiţia alăturată. Ce se va apelului p(123); dacă subprogramul p are definiţia
afişa în urma apeluluif(12345);? alăturată?
void f(long n) void p (int x)
{if (n>9) {cout<<x;
{cout<<n/100; if(x!=0){p(x/10);
f(n/10); cout<<x%10; }}
}}
36. Funcţia f are definiţia alăturată. Ce se va afişa în 42. Subprogramul f este definit alăturat. Ce se
urma apelului f(12345,0);? afişează ca urmare a apelului f(1,3);?
void f(long n, int i) void f (int x,int y)
{if (i<n%10) {int i;
{cout<<n%10; for (i=x;i<=y;i++)
f(n/10,i+1); {
}} cout<<i;
37. Considerăm subprogramul recursiv definit f(i+1,y);
alăturat. Ce se va afişa în urma apelului de mai jos? }}
f(’C’);
43. Se consideră subprogramul recursiv f1 definit
void f(char c) alăturat. Ce se va afişa în urma apelului f1(5);?
{ if (c>’A’) f(c­1); void f1(int x)
cout<<c; { if (x<=9)
if (c>’A’) f(c­1);} { cout<<x+1;
38. Subprogramul afis este definit alăturat. Ce se f1(x+2);
afişează ca urmare a apeluluiafis(8); ? cout<<x+3; }}
void afis (int n) 44. Subprogramul afis este definit alăturat. Ce se
{ va afişa în urma apelului afis(17);?
cout<<n;
for (int i=n/2;i>=1;i­­) void afis(int x)
if(n%i==0)afis(i);} { if (x>3)
39. Subprogramul afis este definit alăturat. Ce se { cout<<x-1;
afişează ca urmare a apeluluiafis(8); ? afis(x/3);
void afis (int n) cout<<x+1;
{ }}
cout<<n;
for (int i=n/2;i>=1;i­­) 45. Ştiind că p este un vector cu 3 în definiţia
if(n%i==0)afis(i); subprogramuluişi betacomponente întregi (vector
} declarat global), stabiliţi cu ce trebuie înlocuite alfa
40. Subprogramul scrie este definit alăturat. Ce se G alăturat astfel încât în urma apelului G(0) să se
afişează ca urmare a apeluluiscrie(2,6); ? afişeze toate numerele de 3 cifre nenule, fiecare
void scrie (int x,int y) număr fiind afişat o singură dată.
{ void G(int k)
cout<<x<<y; {int i;
if(x<y) for(i=1;i<;i++)=alfa
{ { p[k]=i;
scrie(x+1,y­1); if(beta)G(k+1);
cout<<(x+y)/2; else
}} cout<<p[0]<<p[1]<<p[2]<<endl;}}
Probleme subprograme recursive
3) 1+2+3+........+n(varianta recursivă)
int suma(int n){
if (n==0) return 0;
else
return n+suma(n-1);
}
int main(){
int n;
cout<<"n="; cin>>n;
cout<<"Suma="<<suma(n)<<endl;
return 0;
}

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