Transcript Document
RECURSIA 1 RECURSIA DIRECTĂ CONTINUAŢI ENUNŢURILE: Un subprogram este……. Subprogramele sunt de 2 tipuri ……….. Funcţia este ……. Procedura este …. Apelul unei subprogram se face prin intermediul ... Tipul rezultatului unei funcţii poate fi ... Funcţia returnează rezultatul prin…. Procedura returnează rezultatul prin… Parametri actuali sunt ….. Corespondenţa între un parametru actual şi un parametru formal se face…. 2 CARACTERISTICILE Se Rezultatul defineşte se0,1sau în întoarce partea Rezultatul se intoarce Returnează Extinde Estinde Variabile Poate finoţiunea noţiune apelat locale Lista Returnează parametrilor un formali Nume declarativă prin nume a programului prin parametru variabilă mai de deinstrucţiune expresie multe el însuşi rezultate singur rezultat FUNCŢII comune PROCEDURE Tema: “RECURSIA” Subcompetenţe: Prelucrarea datelor cu ajutorul subprogramelor predefinite şi a subprogramelor elaborate de către utilizator. Organizarea comunicării între programul / subprogramul apelant şi subprogramul apelat Proiectarea structurală a algoritmului şi a programului. Utilizarea recursiei pentru rezolvarea problemelor Obiective operaţionale: O1 – să definească termenii: program, subprogram, funcţie procedură, apel, parametri valoare, parametri variabilă, parametri formali, parametri actuali, variabile globale, variabile locale, O2 – să determine corectitudinea antetelor şi apelurilor de subprograme; O3 – să poată evalua programe ce utilizează subprograme recursive, să determine valoarea funcţiei pentru anumite date de intrare; O4 – să explice algoritmul subprogramului recursiv, modul de execuţie al subprogramului recursiv; O5 – să elaboreze programe în care se utilizează subprograme recursive 4 DEFINIŢII ŞI IDEI ANCORĂ Un subprogram se numeşte recursiv dacă el se autoapelează pe el însuşi. În matematică relaţiile recursive se numesc relaţii de recurenţă. (Unele şiruri pot fi definite cu ajutorul unor formule în funcţie de termenul sau termenii precedenţi). Spre exemplu şirul numerelor naturale: 1,2,3… şirul numerelor pare: 2,4,6,8,10... şirul Fibonacci 1,1,3,5,8,13,21...(primii doi termeni sunt egali cu 1, iar fiecare următor terme va fi egal cu suma a doi termeni precedenţi) 5 Scrieţi o funcţie nerecursivă care calculează valoarea lui N! Function fact(N:integer):integer; Var P, i: integer; Begin P:=1; For i:=1 to N do P:=P*i Fact:=P; End; Pentru N=5 P=1 i=1 i=2 i=3 i=4 i=5 P:=P*i P:=P*i P:=P*i P:=P*i P:=P*i P=1*1=1 P=1*2=2 P=2*3=6 P=6*4=24 P=24*5=120 6 Calculul lui N! recursiv Function fact(N:integer):integer; Begin If N=0 then fact:=1 else fact:=N* fact(N-1); End; 5!= 5*4! 5!=5*24=120 4!=4*6=24 4!=4*3! 3!=3*2! 3!=3*2=6 2!=2*1! 2!=2*1=2 1!=1*0! 0!=1 1!=1*1=1 0!=1 7 Scrieţi un program care utilizează funcţia recursivă de calcul a lui N! Program p1; Var x,f: integer; Function fact(N:integer):integer; Begin If N=0 then fact:=1 else fact:=N* fact(N-1); End; Begin Write(‘da valoarea lui x’); readln (x); f:= fact (x); Writeln (f); End. Analizaţi execuţia programului , dacă condiţia va fi N<0 Pentru lecţia practică : Executaţi pentru N=0, 5, 7, 8,10 8 Se consideră funcţia F de mai jos definită recursiv. Ce va returna apelul F(7)? Function F (n:integer):integer; Begin If n=0 then F:=0 else if (n mod 2=0) then F:=F(n-1)+n else F:=F(n-1) - n End; a)-28 b)28 c)-4 d)4 e)0 9 Să se scrie un program ce calculează suma primilor n termeni din şirul numerelor naturale utilizînd o funcţie recursivă / iterativă Program suma_recursiv; Var n: integer; Function S(k: integer):integer; Begin If k=0 then S:=0 else S:=k+S(k-1); End; Begin Write(‘ n=‘); readln(n); Writeln(‘suma este’ , S(n)); End. Program suma_iterativ; Var n: integer; Function S(k: integer):integer; Var i:integer; Begin S:=0; For i:= 1 to k do S:=S+i End; Begin Write(‘ n=‘); readln(n); Writeln(‘suma este’ , S(n)); End. 10 Concluzii: Un algoritm recursiv are acelaşi efect ca şi un ciclu: repetă execuţia unei anumite secvenţe de instrucţiuni E necesar ca repetarea să nu fie la infinit, adică trebuie să existe o condiţie de oprire, cazul elementar ce poate fi calcul direct În majoritatea cazurilor algoritmii recursivi pot fi înlocuiţi cu algoritmi nerecursivi (iterativi), la dorinţa programatorului. Varianta recursivă este recomandată în special pentru problemele definite prin relaţii de recurenţă, care permite o formulare a rezultatelor mult mai clară şi mai concisă: Avantajele recursiei: 1.Structura programului – simplă 2.Volumul de scriere a programului - mic Dezavantajele recursiei: 1.Necesarul de memorie – mare 2.Testarea şi depănarea programelor - complicat 11