Sari la conținut

Capitolul 11 · Lecția 11.2 din 2

Urmărirea funcțiilor recursive cu afișări

Tehnica sigură pentru subiectele 'ce afișează': afișări la coborâre vs la întoarcere.

Capitolul 11: RecursivitateConținut verificat

Pe scurt pentru BAC · 4 idei

  • Afișarea doar înainte de autoapel dă numerele descrescător, 3 2 1, iar afișarea doar după autoapel le dă crescător, 1 2 3.
  • La g(4), parele se afișează la coborâre, iar imparele la întoarcere, deci rezultatul este 4 2 1 3.
  • La funcțiile cu două autoapeluri, ca fib, desenezi arborele de apeluri, iar frunzele lui dau fib(4) = 3.
  • Scrie apelurile în coloană, cu indentare pentru adâncime, și marchează cu săgeți coborârea și întoarcerea.
Pe această pagină5 secțiuni

Regula de aur

Într-o funcție recursivă, instrucțiunile de DINAINTEA autoapelului se execută la COBORÂRE (în ordinea apelurilor), iar cele de DUPĂ autoapel se execută la ÎNTOARCERE (în ordine INVERSĂ).

Exemplul canonic

Afisare inainte si dupa apel

#include <iostream>
using namespace std;

void f(int n) {
    if (n > 0) {
        cout << n << " ";
        f(n - 1);
        cout << n << " ";
    }
}

int main() {
    f(3);
    return 0;
}

Atenție: Prima afisare se face la coborare, a doua la intoarcerea din apeluri. De aceea sirul e simetric: 3 2 1 1 2 3.

se trimit programului la citire

Pentru f(3) se afișează: 3 2 1 1 2 3.

Coborâre (înainte de autoapel): 3, 2, 1; apoi f(0) nu face nimic; întoarcere (după autoapel): 1, 2, 3.

Variațiile care pică la BAC

1. Doar înainte → numerele descrescător: 3 2 1.

2. Doar după → crescător: 1 2 3 (afișarea "amânată" până la întoarcere).

3. Cu condiție de paritate:

Pare la coborare, impare la intoarcere

#include <iostream>
using namespace std;

void g(int n) {
    if (n > 0) {
        if (n % 2 == 0) cout << n << " ";
        g(n - 1);
        if (n % 2 == 1) cout << n << " ";
    }
}

int main() {
    g(5);
    return 0;
}
se trimit programului la citire

Pentru g(4): coborâre afișează parele (4, 2), întoarcere afișează imparele în ordine inversă a coborârii (1, 3): rezultat 4 2 1 3.

Tehnica arborelui de apeluri (pentru două autoapeluri)

Sirul lui Fibonacci, recursiv

#include <iostream>
using namespace std;

int fib(int n) {
    if (n <= 1) return n;
    return fib(n - 1) + fib(n - 2);
}

int main() {
    for (int i = 0; i <= 10; i++)
        cout << fib(i) << " ";
    return 0;
}

Atenție: Varianta recursiva recalculeaza aceleasi valori de foarte multe ori. Pentru n mare devine nefolosibila, de aceea la examen se cere de obicei varianta iterativa.

se trimit programului la citire

fib(4): desenezi arborele: fib(4) → fib(3) + fib(2); fib(3) → fib(2)+fib(1); fib(2) → fib(1)+fib(0). Frunzele dau 1,0,1,1,0 → fib(4) = 3. Numărul de apeluri: 9 (inclusiv rădăcina): la subiectele "de câte ori se apelează", numeri NODURILE arborelui.

Atenție

Scrie apelurile în coloană, cu indentare pentru adâncime, și marchează cu săgeți coborârea și întoarcerea. Fără schema pe hârtie, cazurile cu afișare dublă (înainte + după) se greșesc aproape garantat.

Reține

Ce e scris ÎNAINTE de autoapel se execută la coborâre, în ordinea apelurilor; ce e scris DUPĂ se execută la întoarcere, în ordine inversă. De aceea f(3) afișează 3 2 1 1 2 3. La două autoapeluri numeri nodurile arborelui: fib(4) face 9 apeluri.

Greșeli frecvente

  1. Afișările de după autoapel apar în ordine INVERSĂ: cel mai adânc apel se "întoarce" primul.
  2. Condiția de oprire nu afișează nimic dacă e if (n > 0) {...} fără ramură else.
  3. La două autoapeluri, ordinea e stânga complet, apoi dreapta: nu "în paralel".

Instrumente pentru lecția asta

Stiva apelurilor recursive

Factorial, sumă și Fibonacci pas cu pas: vezi fiecare apel cum intră în stivă, așteaptă și întoarce valoarea, cu codul alături.

Se încarcă instrumentul…

Bifează când ai terminat, ca s-o vezi citită pe toate dispozitivele.

Testează-te pe capitolul 11

Lecția în clipuri

Clipuri scurte, cu voce și subtitrări.

Folosim cookie-uri esențiale, fără de care site-ul nu merge, și cookie-uri de analiză anonimizate, ca să vedem ce pagini ajută. Detalii în politica de confidențialitate