online: 3; azi: 380; total: 52386 Manual clasa a x a - Tehnici de implementarea algoritmilor - Recursivitate

Manual clasa a X a

Tehnici de implementarea algoritmilor

Recursivitate

Scrieţi un program în care, folosind recursivitatea, sa se afiseze termenul n din urmatoarele siruri , cu
a 0 =b 0 =1
an=a n-1 +b n-1
an=a n-1 -b n-1
Calculati adancimea recursivitatiipentru apelurile a(10), b(10), a(11), a(n) si b(n). Scrieti un program iterativ care sa rezolve aceeasi problema.
Pentru a afla termenul n din cele două șiruri, putem utiliza funcții recursive separate pentru fiecare șir. Pentru a calcula adâncimea recursivității, putem utiliza o variabilă statică care să memoreze numărul de apeluri ale funcției în timpul rulării programului.
# include < iostream >
using namespace std ;
// functie recursiva pentru sirul a
int a ( int n, int depth ) {
static int calls = 0 ; // numarul de apeluri ale functiei
calls ++;
if (n == 0 ) {
return 1 ;
} else {
int an1 = a (n - 1 , depth + 1 );
int bn1 = b (n - 1 , depth + 1 );
return an1 + bn1;
}
}
// functie recursiva pentru sirul b
int b ( int n, int depth ) {
static int calls = 0 ; // numarul de apeluri ale functiei
calls ++;
if (n == 0 ) {
return 1 ;
} else {
int an1 = a (n - 1 , depth + 1 );
int bn1 = b (n - 1 , depth + 1 );
return an1 - bn1;
}
}
int main () {
int n;
cout << " Introduceti n: " ;
cin >> n;
// calcularea termenului n din cele doua siruri
int an = a (n, 0 );
int bn = b (n, 0 );
// afisarea rezultatelor
cout << "a(" << n << ") = " << an << endl ;
cout << "b(" << n << ") = " << bn << endl ;
// afisarea adancimii recursivitatii
cout << " Adancimea recursivitatii pentru a(10): " << a ( 10 , 0 ) << endl ;
cout << " Adancimea recursivitatii pentru b(10): " << b ( 10 , 0 ) << endl ;
cout << " Adancimea recursivitatii pentru a(11): " << a ( 11 , 0 ) << endl ;
cout << " Adancimea recursivitatii pentru a(" << n << "): " << a (n, 0 ) << endl ;
cout << " Adancimea recursivitatii pentru b(" << n << "): " << b (n, 0 ) << endl ;
return 0 ;
}
Pentru a evita adâncimea prea mare a recursivității, putem folosi o implementare iterativă a celor două funcții, astfel:
# include < iostream >
using namespace std ;
int main () {
int n;
cout << " Introduceti n: " ;
cin >> n;
// Initializam valorile a0 si b0 cu 1
int a0 = 1 , b0 = 1 ;
// Initializam valorile an_1 si bn_1 cu a0 si b0
int an_1 = a0, bn_1 = b0;
// Initializam variabila an cu 0
int an = 0 ;
// Calculam termenii sirurilor a si b iterativ
for ( int i = 1 ; i <= n; i++) {
an = an_1 + bn_1;
cout << "a(" << i << ") = " << an << endl ;
bn_1 = an_1 - bn_1;
cout << "b(" << i << ") = " << bn_1 << endl ;
an_1 = an;
}
return 0 ;
}

Acest program începe prin citirea valorii lui n , inițializarea valorilor a0 și b0 cu 1 și calcularea primului termen an și bn din siruri folosind aceste valori.
Apoi, într-un buclă for , programul calculează termenii sirurilor iterativ folosind valorile precedente ale lui an și bn . Calculăm an ca an_1 + bn_1 și bn ca an_1 - bn_1 , iar apoi actualizăm valorile precedente an_1 și bn_1 cu valorile curente an și bn .
La fiecare pas al buclei, programul afișează termenii an și bn .
La final, programul se termină și afișează rezultatul.
Rezultatul obținut cu această implementare va fi același cu cel obținut cu implementarea recursivă.