Informatică, întrebare adresată de msdkw, 9 ani în urmă

Elaborati un program Pascal, care contine un subprogram recursiv care calculeaza valoarea functiei F(x), definita astfel:
F(x)=3sin2x+  \sqrt  \frac{3}{4} + x^{2} (factorii de sub radical sunt sub modul)

Anexe:

nokia2700: Salut, de ce un program 'recursiv' ?
nokia2700: recursiv - se defineste prin el insasi
nokia2700: De exemplu: F(x) = 1 + F(x - 1)
nokia2700: Nu intalnim asa definire in acest exercitiu
blindseeker90: Ar putea sa fie o functie compusa care se apeleaza pe ea insasi in argument, de formal F(F(x))
nokia2700: Da, dar nu asta e conditia xD
blindseeker90: eu vreau mai intai sa aflu de ce valoarea de sub radical este in modul, avand in vedere ca este pozitiva indiferent de valoarea lui x
nokia2700: Ai dreptate, cred ca este o eroare sau in problema, sau in scrierea ei
msdkw: nu stiu ,dar asa este conditia exercitiului
blindseeker90: multumim pentru imagine. Mie imi este mai clar acum. O sa ma gandesc

Răspunsuri la întrebare

Răspuns de blindseeker90
1
Gandeste-te ca poti scrie respectiva operatie ca
F(x)=3*(\sin{(2*x)}+\sqrt{|\frac{3}{4}+x^{2}|})
Asta este echivalent cu a aduna de 3 ori la rand expresia pe care o ai intre paranteze. Poti sa folosesti un parametru aditional pentru a regla acel numar de ori aduni,

program operatie_rec;

//functia veche

function Fvechi(x:double):double;
begin
Fvechi:=3*sin(2*x)+sqrt(abs(3/4+x*x));
end;

//recursiv
//poti sa te gandesti ca este ca si cum ai aduna de 3 ori la rand
//formula de mai jos sin(2*x)+1/3*sqrt(abs(3/4+x*x))+F(x,n-1)
//cand ai facut cele 3 adunari succesive, atunci te opresti.
//pentru a obliga functia sa dea acelasi rezultat ca cel de sus
//trebuie sa dai obligatoriu valoarea pentru n=3
function F(x:double;n:integer):double;
begin
if n>0 then F:=sin(2*x)+1/3*sqrt(abs(3/4+x*x))+F(x,n-1)
else
F:=0;
end;
var x:double;
begin
writeln('Scrieti valoarea lui x:');
readln(x);
writeln('Rezultat factorial cu forma iterativa:',Fvechi(x));
writeln('Rezultat factorial cu forma recursiva:',F(x,3));
end.

msdkw: multumesc mult
Alte întrebări interesante