online: 2; azi: 458; total: 52464 Manual clasa a x a - Tehnici de implementarea algoritmilor - Recursivitate

Manual clasa a X a

Tehnici de implementarea algoritmilor

Recursivitate

Se citesc trei numere întregi, a, b şi c, care reprezintă coeficienţii unei ecuaţii de gradul 2, şi un număr natural n. Să e calculeze Sn=X1 n +x2 n , unde x1 şi x2 sunt rădăcinile ecuaţiei . Suma se calculează fără a se rezolva ecuaţia de gradul 2, folosind un subprogram recursiv.
Pentru a rezolva această problemă, putem utiliza formula lui Viète , care ne spune că suma rădăcinelor unei ecuații de gradul 2 este dată de:
S = x1 + x2 = -b/a
De asemenea, putem folosi formula lui Newton pentru a calcula puterile lui x1 și x2 în mod recursiv, astfel:
xn = x1^n + x2^n = (x1 + x2) * xn-1 - x1*x2 * xn-2
Putem scrie acest algoritm într-un subprogram recursiv, denumit " calculeazaSn ". În funcția main , vom citi valorile a, b, c și n, apoi vom apela subprogramul " calculeazaSn " și vom afișa rezultatul.
# include < iostream >
# include < cmath >
using namespace std ;
double calculeazaSn ( int n, double x1, double x2) {
if (n == 1 ) {
return x1 + x2;
} else if (n == 2 ) {
return pow (x1, 2 ) + pow (x2, 2 );
} else {
return (x1 + x2) * calculeazaSn (n -1 , x1, x2) - x1 * x2 * calculeazaSn (n -2 , x1, x2);
}
}
int main () {
int a, b, c, n;
cout << " Introduceti coeficientii a, b si c: " ;
cin >> a >> b >> c;
cout << " Introduceti puterea n: " ;
cin >> n;
double delta = pow (b, 2 ) - 4 *a*c;
if (delta < 0 ) {
cout << "Ecuația nu are soluții reale." << endl ;
return 0 ;
} else {
double x1 = (-b + sqrt (delta)) / ( 2 *a);
double x2 = (-b - sqrt (delta)) / ( 2 *a);
double s = calculeazaSn (n, x1, x2);
cout << "Suma este: " << s << endl ;
}
return 0 ;
}

În funcția " calculeazaSn ", am folosit condiții pentru a trata cazurile n=1 și n=2 în mod explicit, deoarece acestea nu se pot calcula folosind formula generală. Pentru n>2, apelăm funcția recursiv pentru n-1 și n-2.