Sunteți pe pagina 1din 14

Recursivitate.

Algoritmi și tehnici de
programare
Recursivitate. Recapitulare
 Algoritmi recursivi  Funcție recursivă:
 Recursivitate simplă autoapel (cel puțin unul)
(algoritmi uni-recursivi)  Recursivitate directă
 Recursivitate multiplă ▪ Simplă
(algoritmi multi-recursivi) ▪ Multiplă
 Elemente obligatorii:  Recursivitate mutuală
▪ Formulă de start (o formulă / ▪ Declarare anticipată a
mai multe) funcțiilor
▪ Formulă recursivă

Avantaje și dezavantaje
Consum de memorie
Timp de procesare
Ușurința în proiectare/implementare
Recursivitate. Funcții recursive

 Construirea funcțiilor recursive


 Asigurarea caracterului finit al algoritmului: încheiere după un număr finit de
repetări
▪ Fiecare apel recursiv trebuie aplicat unei probleme mai simple (mai puțin
complexe, cu număr mai mic de date) decât în iterația curentă
▪ Oprire când problema curentă este trivială
 Condiție de oprire a generării de noi apeluri recursive
▪ Aplică formula de start dacă e îndeplinită condiția
▪ Aplică formula recursivă altfel

long fact ( unsigned n )


{ long f;
if ( !n )
f = 1; 0!=1 – STOP!
else
f = n*fact ( n-1);
return f; n!=n*(n-1)!
}
Recursivitate. Funcții recursive

apelator
fact(3) t1
 Memorie ocupată
fact(3)
3*fact(2) t2

fact(2)
Stack 2 * fact(1) t3
Return address
t1 3 t8 fact(1)
f 1 * fact(0) t4
Return address
t2 2 t7
f fact(0)
Return address 1
t3 1 t6
f 1*1=1 t5
Return address
t4 0 t5
f 2*1=2 t6

3*2=6 t7

6 t8
Recursivitate, funcții recursive

fib(n) = fib(n-1) + fib(n-2), fib(1) = fib(0) = 1

fib( 4 )
fib( 1 )
fib( 3 )
fib( 2 ) 1
fib( 0 )
fib( 1 )
1
1 2
fib( 0 )
5
1
2
fib( 1 )
1
3
fib( 2 )
Recursivitate, funcții recursive

Calculul combinărilor (combinări de n luate cîte k)


=> ,

long comb(unsigned n, unsigned k)


{ long c;
if (k>n) Nu pot calcula! –
STOP!
c = 0;
else
if ((k==0)||(k==n))
c = 1; – STOP!
else
c = comb(n-1,k) + comb(n-1,k-1);
return c;
}
Recursivitate, funcții recursive

Calculul sumei cifrelor unui număr – rezultat returnat prin parametru

void SumCifRec(unsigned n, unsigned &r)


{
if (n / 10 == 0)
r=n; – STOP!
else{
SumCifRec(n / 10, r);
r += n % 10;
}
}

Constituire soluție
Recursivitate, funcții recursive

Calculul sumei cifrelor unui număr – rezultat returnat prin numele funcției

unsigned SumCifRec1(unsigned n)
{ int r;

if (n / 10 == 0) r=n;
return n;
else
return n % 10 + SumCifRec1(n / 10);
}
r= n % 10 + SumCifRec1(n /
return r; 10);;
Recursivitate, funcții recursive

Suma cifrelor conținute de un șir de caractere – dacă șirul nu conține


cifre returnează 0
int SC(char s[])
{ – STOP!
int k ;
if (strlen(s) == 0)
k = 0;
else{
k = SC(s + 1);
if (isdigit(s[0]))
k += int(s[0] - '0');
}
return k;
Constituire soluție
}
Recursivitate, funcții recursive

Calculul c.m.m.d.c al două numere naturale

int cmmdc(int a, int b)


{
if (a == 0)
return b;
else
if (b == 0)
return a;
else
if (a > b)
return cmmdc(a - b, b);
else
return cmmdc(a, b - a);
}
Recursivitate, funcții recursive
int cmmdc(int a, int b)
{
int r;
if (a == 0)
r=b;
else
if (b == 0)
r=a;
else
if (a > b)
r = cmmdc(a - b, b);
else
r = cmmdc(a, b - a);
return r;
}
Recursivitate, funcții recursive

Calculul recursiv al numărului de apariții ale unei secvențe într-un șir de


caractere – fără suprapuneri

unsigned nr_aparitii(char sir[], char secventa[])


{
Adresa primei
char *pointer = strstr(sir, secventa);
apariții a
unsigned p; șirului
if (pointer == NULL) secventa in
p = 0; șirul sir
else
p = 1 + nr_aparitii(pointer+strlen(secventa), secventa);
return p;
}
Recursivitate, funcții recursive
Calculul recursiv al cifrei minime și al cifrei maxime ale unui număr
întreg
void cifmaxmin(int n, int &max, int &min)
{
if (n / 10 == 0)
min = max = n;
else{
cifmaxmin(n / 10, max, min);
int c = n % 10;
if (c < min)
min = c;
else
if (c > max)
max = c;
}
}
Recursivitate, funcții mutual recursive
Verificarea parității unui număr natural
unsigned este_impar(unsigned int);

unsigned este_par(unsigned int n)


{
if (n == 0)
return 1;
else
return este_impar(n-1);
}

unsigned este_impar(unsigned int n)


{
if (n == 0)
return 0;
else
return este_par(n-1);
}

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