160 likes | 364 Views
Recursivitate si vectori. Membri grupei : Cremine Denisa Costea Anneliese Calugar Andrei. Prof. Tomsa Gelu. Motto: Ionformatica nu inseamna calcul.Calculul este facut de masini de calcul.Informaticii ii apartine fantezia, imaginatia, demonstratia. Vectori. 1. Vectori Adresare :v[x]
E N D
Recursivitatesivectori Membri grupei: Cremine Denisa Costea Anneliese Calugar Andrei Prof. Tomsa Gelu
Motto: Ionformatica nu inseamna calcul.Calculul este facut de masini de calcul.Informaticii ii apartine fantezia, imaginatia, demonstratia.
Vectori 1. Vectori Adresare:v[x] Exemplu de vector : 4 1 2 9 0 5 3 2 Adresare:v[x] v[1]=4 (primul element) v[2]=1 (al doilea element) v[3]=2 (al treilea element) ............ v[8]=2(al optulea) Utilizare Vectoriise utilizeaza,in special,pentru a calcula anumite sume,pentru a aranja in ordine crescatoare anumiti termeni sau pentru ecuatii care ar putea fi mai greu de rezolvat folosind alte programe.
Citiresideclarare Declarare type vector=array[1..100] of tip_de_date; var v:vector; n-nr de elemente Program citire+afisare program citire_afisare; type vector=array[1..100] of integer; var a:vector; n,i:integer; begin write(‘n=’); readln(n); for i:=1 to n do begin write(‘a[‘,i,’]=’); readln(a[i]); end; for i:=1 to n do write(a[i],’ ‘); readln; end.
Program suma si produsul tuturor elementelor program suma_produs; type vector=array[1..100] of integer; 4 var v:vector; n,i,s,p:integer; begin write(‘n=’); readln(n); for i:=1 to n do begin write(‘v[‘,i,’]=’); readln(v[i]); end; for i:=1 to n do write(v[i],’ ‘); s:=0; for i:=1 to n do s:=s+v[i]; writeln(‘Suma nr este’ , s); p:=1; for i:=1 to n do p:=p*v[i]; writeln(‘Produsul nr este’ , p); readln; end. Programe care folosescvectorii
Program in care se numara numerele poz si cele neg program numarare; type vector=array[1..100] of integer; var a:vector; n,i,nn,np:integer; begin write(‘n=’); readln(n); for i:=1 to n do begin write(‘a[‘,i,’]=’); readln(a[i]); end; for i:=1 to n do write(a[i],’ ‘); nn:=0; np:=0; for i:=1 to n do begin if v[i]<0 then nn:=nn+1; if v[i]>0 then np:=np+1; end; write(‘Sunt’ ,nn, ’nr neg si’ ,np, ’nr poz’); readln; end. Program in care se maresc cu 1 numerele divizibile cu 3 program divizibil; type vector=array[1..100] of integer; var a:vector; n,i:integer; begin write(‘n=’); readln(n); for i:=1 to n do begin write(‘a[‘,i,’]=’); readln(a[i]); end; for i:=1 to n do write(a[i],’ ‘); for i:=1 to n do if v[i] mod 3=0 then v[i]:=v[i]+1; readln; end.
Sortari de vectori Metoda de sortare Ordonarea datelor prin interschimb si “miscarea” lor spre stanga sau dreapta,asemenea unor bule,poarta numele de Bubble Sort sau Metoda Bulelor. Se repeta parcurgerea vectorului cu interschimbul elementelor care nu respecta relatia de ordine pana cand se ajunge la o parcurgere fara interschimb.Prin ordonare,elementele si-au schimbat pozitia astfel incat la stanga oricarui element se afla toate valorile mai mici decat el,iar la dreapta sa,toate valorile mai mari.Trecerea vectorului de la configuratia initiala la configuratia finala se face prin compararea elementelor invecinate si schimbarea pozitiei lor astfel incat valorile mici sa se deplaseze spre stanga,,iar cele mari spre dreapta.
a)Sortareaprinmetodabulelor Secventa de program type vector=array[1..100] of integer; var a:vector; i,n,x:integer; inv:boolean; begin write('n='); readln(n); for i:=1 to n do begin write('a[',i,']='); readln(a[i]); End; repeat inv:=false; for i:=1 to n-1 do if a[i]>a[i+1] then begin inv:=true; x:=a[i]; a[i]:=a[i+1]; a[i+1]:=x; end; until not inv; for i:=1 to n do write(a[i],' '); readln end.
b)Interclasarea Secventa de program Metoda : Interclasarea este rationamentul prin care,pornind de la doua tablouri de date ordonate dupa acelasi criteriu,se obtine un tablou nou ce contine fiecare dintre valorile celor doua tablouri,ordonate dupa acelasi criteriu.Pentrurealizarea interclasarii sunt necesare urmatoarele: -capacitatea celor doua tablouri de valori -nr de valori(n) din primul tablou -n valori ordonate crescator -numarul de valori(m) din cel de-al doilea tablou -m valori ordonate crescator -valorile tabloului rezultat prin interclasare
type vector= array[1..20] of integer; var a,b,c:vector; i,n,j,k,x,y,m:integer; begin write('m=');readln(m); for i:=1 to m do begin write('a[',i,']='); readln(a[i]); end; write('n=');readln(n); for i:=1 to n do begin write('b[',i,']='); readln(b[i]); end; i:=1; j:=1; k:=1; while (i<=m) and (j<=n) do begin if a[i]<b[j] then begin c[k]:=a[i]; i:=i+1; end Secventa de program else begin c[k]:=b[j]; j:=j+1; end; k:=k+1; end; if i<=m then for x:=i to m do begin c[k]:=a[x]; k:=k+1; end; if j<=n then for y:=j to n do begin c[k]:=a[y]; k:=k+1; end; for i:=1 to n do write(c[i],' '); readln; end.
recursivitatea Ce este recursivitatea? Recursivitatea este un concept matematic care implica definirea unu concept prin referire la acelasi concept Astfel |N se poate defini : * 1 este nr natural *orice succesor al unui nr natural este asemenea unui nr natural * valoare initiala (1) * restul valorii se obtine adunand 1 la valoarea anterioara . Factorialul lui n se poate defini recursiv astfel: 0!=1 n!=n*(n-1)!,pentru n> 0 f(n)=n! -----> definitia recursiva a functiei. f(n) {1 daca n=0 {n*f (n-1) ,pentru n>0
Programul principal Var n : integer; begin write ('n='); readln (n); writeln(n, '!=',f(n)); end. Ex: n=3 f(3)=3* f(2)=6 f (2)=2*f(1)=2 f(1)= 1* f(0)=1 f(0)=1 -Fiecare apel adauga un context nou in stiva -Apelul recursiv se termina cand ajunge la rezolvarea directa -La revenirea la apelul resursiv se goleste stiva Apel recursiv: function f(n: integer): integer; begin if n=0 then f:=1 else f:= n*f(n-1);
Reguli pentru scrierea subprogramelor recursive Orice subprogram recursiv trebuie să se execute, cel puţin o dată, fără a se autoapela. Condiţia de oprire se va scrie pentru valori extreme ale mulţimii valorilor de testat. Autoapelurile trebuie să conducă spre situaţia (situaţiile ) în care subprogramul se execută direct (fără autoapel). Tipuri de recursivitate Există două tipuri de subprograme recursive : *subprograme direct recursive: - un subprogram Q în corpul căruia există cel puţin un autoapel (Q apelează pe Q) se numeşte subprogram direct recursiv *subprograme indirect recursive: - două subprograme A şi B se numesc indirect recusrive dacă se apelează reciproc (A apelează pe B şi B apelează A) .
Cum se scrie un subprogram recursiv Trebuie să formulăm problema în termeni recursivi - formula de recurenţă - soluţia în cazul rezolvării directe, dată de obicei sub forma condiţiilor iniţiale - formulăm subproblemele de rezolvat în cazul în care nu dispunem de o formulă de recurenţă Scriem subprogramul recursiv: - soluţia directă se scrie sub forma condiţiei de oprire - apelul recursiv rezultă din formula de recurenţă - la fiecare apel problema parţială trebuie rezolvată complet
Probleme 1.Tipariti primele n nr naturale cu o procedurarecursiva: Crescator : var n: integer; procedure p (i:integer); begin if i=n then write (n); else begin write (i,' '); p(i+1); end ; end; begin write ('n='); readln; p(1); readln;end Descrescator: var n: integer; procedure p (i:integer); begin if i=1 then write (1); else begin write (i,' '); p(i-1); end ; end; begin write ('n='); readln; p(n); readln;end
3.Tipareste vectorul de la V[1] la V[n]: type vector =array [1..100] of integer; var v: vector; n:integer; procedure citire (var v:vector,n:integer); var 1:integer; begin write ('n=');readln (n); for i:= 1 to n do begin write ('v[',i,']=');readln (v[i]); end;end; p recursiva procedure citire (i: integer) begin if i< n+1 do begin write (v[;,i,']='); readln (v[i]); citire (i+1); end;end; begin write ('n='); readln (n); citire 1; readln; end. 2.Se citeste un vector de la tastatura .Sa se afiseze literele in ordine inversa: procedure n; var c:char; begin read(c); if c<>'.' then if c= '.' then writeln else begin p; write (c); end; begin p; readln; end.