Consolidare - Recursivitate

Informatică clasa a 11-a

Aplicații Numerice

1. Ce returnează f(3)?

Vector a = {5, 203, 2, 37, 11, 4}

float f(int i) 
{
    if (i == 0) 
    {
        return 0;
    }
    else 
    {
        return (a[i] + f(i - 1));
    }
}
Explicație: a[3]+a[2]+a[1]+f(0) = 37+2+203+0 = 242.

2. Ce returnează f(4)?

float f(int i) 
{
    if (i == 0) 
    {
        return 0;
    }
    else 
    {
        return (((i + 1) * (i + 2)) + f(i - 1));
    }
}
Explicație: (5*6)+(4*5)+(3*4)+(2*3)+0 = 30+20+12+6 = 68.

3. Valoarea parametrului m la finalul f(1432)?

void f(long n, long &m) 
{
    if (n != 0) 
    {
        m = m * 10 + n % 10;
        f(n / 10, m);
    }
}
Explicație: m preia resturile succesive, inversând cifrele lui n.

4. Ce returnează f(36, 48)?

int f(int a, int b) 
{
    if (b) 
    {
        return f(b, a % b);
    }
    else 
    {
        return a;
    }
}
Explicație: Algoritmul lui Euclid pentru CMMDC. cmmdc(36, 48) = 12.

Concepte și Erori

1. Ce se înțelege prin recursivitate directă?

Explicație: Recursivitatea este directă când corpul funcției conține apelul propriei funcții.

2. Care este greșeala în funcția suma(int i)?

int suma(int i) 
{
    if (i == 0) return 0;
    else 
        if (a[i] % 2 == 0) return suma(i + 1) + a[i];
        else return suma(i - 1);
}
Explicație: Dacă mergem spre i+1, i nu va ajunge niciodată la 0 (condiția de oprire).

3. Ce returnează f(5)?

int f(int i) 
{
    if (i == 0) return 0;
    if (i % 2 == 0) return f(i - 1) + i;
    else return f(i - 1) - i;
}
Trace: -5 + 4 - 3 + 2 - 1 = -3.

Analiză Algoritmi

Ce valori conțin x și y pentru a=75, b=12?

void f(long a, long b, long &x, long &y) 
{
    if (y >= b) 
    {
        y = a - b;
        x++;
        f(a - b, b, x, y);
    }
}
Explicație: Calculează câtul (x) și restul (y) împărțirii lui 75 la 12 prin scăderi.

Ce returnează f(3)?

float f(int i) 
{
    if (i == 0) return 0;
    return f(i - 1) + i * (i + 1);
}
Explicație: (3*4) + (2*3) + (1*2) = 12 + 6 + 2 = 20.

Ce returnează f(10)?

int f(int x) 
{
    if (x < 1) return 0;
    else return f(x - 3) + x;
}
Explicație: 10 + 7 + 4 + 1 = 22.

Recursivitate Indirectă

Ce va returna apelul este_par(3)?

bool este_par(int n) {
    if (n == 0) return true;
    return este_impar(n - 1);
}

bool este_impar(int n) {
    if (n == 0) return false;
    return este_par(n - 1);
}
Explicație: Lanțul de apeluri este: este_par(3) -> este_impar(2) -> este_par(1) -> este_impar(0), care returnează false.