f(9)Recursivitate: afișare pe drum și apeluri de completat (doar matematică-informatică)
Doar la matematică-informatică. Ce se afișează înainte de autoapel și ce după, parametrul transmis prin valoare și cel prin referință, funcții cu două ramuri sau cu for. Grile oficiale urmărite pas cu pas.
- 24 min
- La BAC: I (4p)
- De revizuit

ții minte doar fișa asta și ești acoperit
Fișa de aur
- 01
Doar la matematică-informatică.
- 02
Înainte de autoapel: se afișează la coborâre, în ordinea apelurilor.
- 03
După autoapel: se afișează la întoarcere, în ordine inversă.
Truc: Înainte = dus. După = întors.
- 04
Prin valoare: fiecare apel are copia lui. Prin referință (&): toți lucrează cu aceeași variabilă.
- 05
Condiția de oprire poate afișa și ea: la f(23), iunie 2023, apare și un 0 la început.
- 06
Apel de completat: verifică varianta până la capăt și vezi dacă se oprește unde trebuie.
Pe scurt
Culorile din lecție:termencifră, datăidee-cheie
- Doar la matematică-informatică.
- Când o funcție recursivă afișează, contează unde este afișarea: înainte de autoapel sau după el.
- Aceste grile valorează 4 p și se rezolvă pe ciornă, cu apelurile scrise unul sub altul.
Cele două locuri
Gândește-te la un lift care coboară etaj cu etaj și apoi urcă. Ce faci înainte de autoapel se întâmplă la coborâre. Ce faci după autoapel se întâmplă la urcare, deci în ordine inversă.
void dn(int n)
{ if(n>0)
{ cout<<n<<" ";
dn(n-1);
}
}
void up(int n)
{ if(n>0)
{ up(n-1);
cout<<n<<" ";
}
}
dn(3) afișează 3 2 1, iar up(3) afișează 1 2 3. Singura diferență este ordinea celor două linii.
În lucrări, afișarea apare scrisă cout<<x; | printf("%d",x);. Bara separă cele două forme, C++ și C. E o singură afișare. Aici folosim doar forma cout.
if(n!=0) f(n/2); apoi cout<<n%2; Ce afișează f(23)?
Oficial: iunie 2023, varianta 5, I.2
void f(int n)
{ if(n!=0) f(n/2);
cout<<n%2;
}
Apelul este f(23). Cobori: 23, 11, 5, 2, 1, 0. Afișarea e după autoapel, deci începe de la ultimul apel, f(0): 0%2 = 0.
Apel, de jos în susAfișează
f(0)f(1)f(2)f(5)f(11)f(23)| Apel, de jos în sus | Afișează |
|---|---|
f(0) | 0 |
f(1) | 1 |
f(2) | 0 |
f(5) | 1 |
f(11) | 1 |
f(23) | 1 |
Rezultatul: 010111, varianta c. Funcția scrie numărul în baza 2, cu un 0 în față, pentru că și f(0) ajunge la cout.
Oficial: iulie 2024, varianta 3, I.2
void f(int x,int y)
{ if(x<10) cout<<x;
else
{ f(x/10,y+1);
cout<<x%10;
}
cout<<y;
}
Apelul este f(2020,0). Cobori: (2020,0), (202,1), (20,2), (2,3).
Apel, de jos în susAfișează
f(2,3)f(20,2)f(202,1)f(2020,0)| Apel, de jos în sus | Afișează |
|---|---|
f(2,3) | 2, apoi 3 |
f(20,2) | 0, apoi 2 |
f(202,1) | 2, apoi 1 |
f(2020,0) | 0, apoi 0 |
Rezultatul: 23022100, varianta d. Rândul cu cout<<y se execută la fiecare apel, pentru că e în afara lui else.
Oficial: simulare 2024, I.2
Când funcția are ramuri diferite, unele afișează la coborâre, altele la urcare.
void f(int x)
{ if(x>=24)
if(x%2==0)
{ cout<<2;
f(x/2);
}
else
{ f(x/2);
cout<<4;
}
else cout<<0;
}
Pentru f(2024), valorile sunt 2024, 1012, 506, 253, 126, 63, 31, 15.
- Numerele pare afișează 2 la coborâre: 2024, 1012, 506, apoi 126 dau
2222. - La 15 se afișează
0. - Numerele impare afișează 4 la urcare: 31, 63, 253 dau
444.
Rezultatul: 22220444, varianta b.
Valoare sau referință
Sesiunea specială 2024, varianta 4, I.2. Apelul este f(9).
void f(int x)
{ if(x%5!=0)
{ x=x*5/2; f(x); }
else x=x-1;
cout<<x;
}
f(22)f(55)| Apel | x la intrare | x după atribuire | Afișează, la urcare |
|---|---|---|---|
f(9) | 9 | 22 | 22 |
f(22) | 22 | 55 | 55 |
f(55) | 55 | 54 | 54 |
Citești ultima coloană de jos în sus: 545522, varianta b. Fiecare apel are x-ul lui, iar valoarea afișată e cea de după atribuire.
Simulare 2026, I.3. Aici apare &, iar variabila este aceeași în toate apelurile.
void f(int &n)
{ if(n>0)
{ cout<<n;
n=n-1;
f(n);
cout<<n;
}
}
Secvența este x=3; f(x);. La coborâre se afișează 3, 2, 1, iar n ajunge la 0. Toate apelurile lucrează cu aceeași variabilă, deci la urcare cout<<n afișează 0 de trei ori. Rezultatul: 321000, varianta a.
În Pascal, transmiterea prin referință se scrie cu var: procedure f(var n:integer);.
Ce valoare are n după autoapel, dacă e transmis prin referință?
Două ramuri și for
Sesiunea specială 2025, varianta 6, I.2. Apelul este f(2050).
void f(int n)
{ cout<<n<<' ';
if(n%10!=0)
{ cout<<n<<' ';
f(n/10);
}
else if(n!=0)
{ f(n/10);
cout<<n<<' ';
}
}
- 2050 se termină în 0: afișează 2050, apelează, iar la urcare afișează din nou 2050.
- 205: afișează de două ori, apoi apelează.
- 20: ca la 2050.
- 2: afișează de două ori, apoi apelează.
- 0: afișează 0 și se oprește.
Rezultatul: 2050 205 205 20 2 2 0 20 2050, varianta c.
Iunie 2025, varianta 1, I.2. Apelul este f(3), iar autoapelul stă într-un for.
void f(int n)
{ int i;
for(i=1;i<=n;i++)
if(i%2==0)
{ cout<<i;
f(i-1);
}
else
{ f(i-1);
cout<<i;
}
}
Aici e mai sigur să construiești de jos în sus, un apel pe rând:
f(0)for nu se executăf(1)f(0), apoi 1f(2)f(1)f(3)f(1); i=3: f(2), apoi 3| Apel | Ce face | Afișează |
|---|---|---|
f(0) | for nu se execută | nimic |
f(1) | i=1: f(0), apoi 1 | 1 |
f(2) | i=1: 1; i=2: 2, apoi f(1) | 121 |
f(3) | i=1: 1; i=2: 2, f(1); i=3: f(2), apoi 3 | 1 21 121 3 |
Rezultatul: 1211213, varianta a.
Apeluri și condiții de completat
Aici nu urmărești o singură funcție, ci alegi între patru. Încearcă varianta pe cerință, de la capăt.
Iunie 2026, varianta 3, I.2. f(35,17) trebuie să afișeze 7.
void f(int n,int d)
{ if(n%d==0) cout<<d;
else f(........);
}
Funcția caută un divizor al lui n. Ca să ajungi de la 17 la 7, d trebuie să scadă, iar n să rămână 35. Varianta corectă: d, n,d-1. Cu n,d+1, primul divizor găsit ar fi 35.
August 2026, varianta 1, I.2. f(10) trebuie să afișeze 1 2 ... 10.
void f(int x)
{ if(......)
{ f(x-1);
cout<<x<<' ';
}
}
Afișarea e după autoapel, deci ordinea e crescătoare. Oprirea trebuie să fie după ce a trecut de 1. Varianta corectă: d, x>=1. Cu x>=2, se pierde 1. x<=10 nu se oprește niciodată la coborâre.
Model 2023, I.2. Se cere un apel după care se afișează de două ori 23. Funcția afișează (m+n)/2 și continuă cu f(m+1,n-2) cât timp m<=n. Doar f(21,27) dă 24 23 23 22. Barem: varianta d.
August 2024, varianta 8, I.2. Se cere apelul care afișează 13579. Funcția afișează y și continuă cu f(x,y+2,z+1) cât timp z<x. Primul număr e 1, deci y=1. Sunt cinci numere, deci x-z=5. Varianta corectă: d, f(6,1,1).
Ce condiție afișează 1 2 ... 10 la f(10), dacă f(x-1) e înainte de cout?
Ce se cere la BAC
| Tip de item | Unde a apărut | Ce urmărești |
|---|---|---|
| Afișare după autoapel | iunie 2023 I.2, iulie 2024 I.2 | ordine inversă |
| Ramuri diferite | simulare 2024 I.2, specială 2025 I.2 | care ramură afișează la dus și care la întors |
| Valoare sau referință | specială 2024 I.2, simulare 2026 I.3 | antetul |
| Autoapel în for | iunie 2025 I.2 | construiești de jos în sus |
| Parametri sau condiție de completat | iunie 2026 I.2, august 2026 I.2 | încerci variantele până la capăt |
| Apel de ales | model 2023 I.2, august 2024 I.2 | rulezi fiecare variantă |
Greșeli care costă puncte
- Uiți apelul în care condiția e falsă, dacă afișarea e în afara lui
if, ca laf(0)din iunie 2023. - Citești coloana de afișări de sus în jos, deși afișarea e după autoapel.
- Nu observi
&din antet. - Încurci ce aparține de
else: uită-te la acolade, ca să știi ce instrucțiuni sunt în ramură. - Te oprești la primele cifre și bifezi o variantă care începe la fel.
- Citești bara din
cout<<x; | printf(...)ca pe două afișări.
Termeni-cheie
- Înainte de autoapel
- Instrucțiunile de acolo se execută la coborâre, în ordinea apelurilor.
- După autoapel
- Instrucțiunile de acolo se execută la întoarcere, în ordine inversă.
- Parametru transmis prin valoare
- Fiecare apel are copia lui. O modificare în apelul următor nu se vede la întoarcere.
- Parametru transmis prin referință
- Toate apelurile lucrează cu aceeași variabilă; se scrie cu & în antet: void f(int &n).
- Apel de completat
- Grilă în care lipsesc parametrii autoapelului sau condiția, iar tu alegi varianta care dă afișarea cerută.
Notițele mele
Salvat localSurse
- BAC 2023, sesiunea iunie-iulie, varianta 5, MI: I.2, cu barem
- BAC 2024, sesiunea iulie, varianta 3, MI: I.2, cu barem
- Simulare BAC 2024, MI: I.2, cu barem
- BAC 2024, sesiunea specială, varianta 4, MI: I.2, cu barem
- Simulare BAC 2026, MI: I.3, cu barem
- BAC 2025, sesiunea specială, varianta 6, MI: I.2, cu barem
- BAC 2025, sesiunea iunie, varianta 1, MI: I.2, cu barem
- BAC 2026, sesiunea iunie-iulie, varianta 3, MI: I.2, cu barem
- BAC 2026, sesiunea august, varianta 1, MI: I.2, cu barem
- Model BAC 2023, MI: I.2, cu barem
- BAC 2024, sesiunea august, varianta 8, MI: I.2, cu barem