Recursivitate

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
Ilustrație: Recursivitate: afișare pe drum și apeluri de completat (doar matematică-informatică)
Ilustrație generată pentru ZECE (artistică, nu o planșă științifică: pentru detalii exacte vezi schemele din lecție).

ții minte doar fișa asta și ești acoperit

Fișa de aur

  1. 01

    Doar la matematică-informatică.

  2. 02

    Înainte de autoapel: se afișează la coborâre, în ordinea apelurilor.

  3. 03

    După autoapel: se afișează la întoarcere, în ordine inversă.

    Truc: Înainte = dus. După = întors.

  4. 04

    Prin valoare: fiecare apel are copia lui. Prin referință (&): toți lucrează cu aceeași variabilă.

  5. 05

    Condiția de oprire poate afișa și ea: la f(23), iunie 2023, apare și un 0 la început.

  6. 06

    Apel de completat: verifică varianta până la capăt și vezi dacă se oprește unde trebuie.

1 din 10

Pe scurt

1 minesențialul, de recitit oricând

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

2 min o întrebare la final

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

2 min

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)
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

2 min

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)
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

2 min

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ță

4 min o întrebare la final

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(9)
x la intrare
9
x după atribuire
22
Afișează, la urcare
22
f(22)
x la intrare
22
x după atribuire
55
Afișează, la urcare
55
f(55)
x la intrare
55
x după atribuire
54
Afișează, la urcare
54
1 / 3

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

4 min

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)
Ce face
for nu se execută
Afișează
nimic
f(1)
Ce face
i=1: f(0), apoi 1
Afișează
1
f(2)
Ce face
i=1: 1; i=2: 2, apoi f(1)
Afișează
121
f(3)
Ce face
i=1: 1; i=2: 2, f(1); i=3: f(2), apoi 3
Afișează
1 21 121 3
1 / 4

Rezultatul: 1211213, varianta a.

Apeluri și condiții de completat

4 min o întrebare la final

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

3 mincum apare la examen

Afișare după autoapel
Unde a apărut
iunie 2023 I.2, iulie 2024 I.2
Ce urmărești
ordine inversă
Ramuri diferite
Unde a apărut
simulare 2024 I.2, specială 2025 I.2
Ce urmărești
care ramură afișează la dus și care la întors
Valoare sau referință
Unde a apărut
specială 2024 I.2, simulare 2026 I.3
Ce urmărești
antetul
Autoapel în for
Unde a apărut
iunie 2025 I.2
Ce urmărești
construiești de jos în sus
Parametri sau condiție de completat
Unde a apărut
iunie 2026 I.2, august 2026 I.2
Ce urmărești
încerci variantele până la capăt
Apel de ales
Unde a apărut
model 2023 I.2, august 2024 I.2
Ce urmărești
rulezi fiecare variantă
1 / 6

Greșeli care costă puncte

2 mincapcanele de evitat

  • Uiți apelul în care condiția e falsă, dacă afișarea e în afara lui if, ca la f(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 local

Surse