Sunteți pe pagina 1din 4

Recursivitate

prof. Craina Sanda

1. Se cit un sir de n val intregi, sa se afis cele care contin un nr maxim de cifre distincte Indic: - o functie recursiva D care intoarce nr de cifre distincte ale unei valori distincte ale unei valori intregi primate ca parametru - la randul sau, functia D va apela functia recursive NR, care determina numarul de aparitii al unei cifre intr-un numar (ambele valori vor fi transmise prin parametri) - Ex: n=5 si valorile: 121, 38, 7, 1188, 22 se va afisa 121, 38, 1188 - Solutie: o Functia D determina numarul de cifre distinct ale parametrului x prin numararea cifrelor de la 0 la 9 care apar cel putin o data in scrierea acestuia; cele 10 cifre sunt retinute prin intermediul parametrului valoare i; in acest fel, la apelul D(x,0) se returneaza numarul de cifre distinct ale lui x o Subprogramul P permite citirea fiecarei valori din sirul celor n; numarul de cifre distinct ale fiecarei valori citite va fi salvat cu cu ajutorul variabilei locale y; la revenirea din recursivitate vor fi afisate acele valori pt care valoarea variabilei y este egala cu valoarea finala a lui max

program n1; {afis elem din sir care contin un nr max de cifre distincte ex: n=5 sir: 121, 38, 7, 1188, 22 va afisa: 1188, 38, 121} var n,max :integer; function NR(x,c:integer):integer; {nr de aparitii a unei cifre intr-un nr} {pp} begin if x=0 then NR:=0 begin else if x mod 10 =c then max:=0; NR:=NR(x div 10,c)+1 write('n='); readln(n); else P(1,max); NR:=NR(x div 10,c); readln; end; end. function D(x,i:integer):byte; {nr de cifre distincte ale lui x} begin if i>9 then D:=0 else if NR(x,i)>=1 then D:=D(x,i+1)+1 else D:=D(x,i+1); end; procedure P(i:integer; var max:integer); var x,y:integer; {citeste sirul, apeleaza D si salveaza valorile distincte in y se autoapeleaza si afiseaza acele val pt care y=val finala a lui max} begin if i<=n then begin write('x='); readln(x); y:=D(x,0); if y>max then max:=y; P(i+1,max); if max=y then write(x,' '); end; end; begin max:=0; write('n='); readln(n); P(1,max);

Recursivitate

prof. Craina Sanda

2. Se cit un vector de n val natural (n<=50) ; realiz un subprogram recursive M, care primeste, prin parametrul a, un astfel de vector si care inlocuieste fiecare elem a[i] cu suma cifrelor lui care au aceeasi paritate cu indicele i Indic: - Subprogramul va apela functia C, care calc la alegere suma cifrelor pare sau impare ale unei valori transmise prin parametrul intreg x - Parametrul t al functiei, va primi la apel valoarea 1 daca se doreste calcularea sumei cifrelor impare si 0 in caz contrar - Ex: n=5 si valorile: 121, 382, 7, 1188,22 se va afisa: 2. 10. 7 16, 0 - Solutie: o Functia C parcurge cifra cu cifra nr transmis prin parametrul x verificand daca restul impartirii la 2 este egal cu t o Subprogramul M are, ca parametru de referinta, vectorul a si, ca parametru valoare, indicele i; la fiecare autoapel se actualizeaza elementul a[i] cu valoarea returnata in urma apelului C(a[i], I mod 2)

program n2; {inlocuieste fiecare elem a[i] cu suma cifrelor care au aceeasi paritate cu i ex: n=5 si a=(121, 382, 7, 1188, 22) va afisa: 2, 10, 7, 16, 0} type vect=array[1..50] of integer; var n,i:integer; a:vect; function C(x,t:integer):byte; begin if x=0 then C:=0 else if x mod 2=t then C:=C(x div 10,t)+x mod 10 else C:=C(x div 10,t); end; procedure M(i:byte; var a:vect); begin if i<=n then begin a[i]:=C(a[i],i mod 2); M(i+1,a); end; end; begin write('n='); readln(n); for i:=1 to n do begin write('a[i]='); readln(a[i]); M(i,a); end; for i:=1 to n do write(a[i],' '); readln; end.

Recursivitate

prof. Craina Sanda

3. Se citeste un sir de n valori natural de cel mult 9 cifre. Sa se afiseze in ordine inversa, a valorilor citite din care au fost sterse cifrele impare Indic: - Subprogramul M recursiv efectueaza prelucrarea ceruta, fara a folosi tablou pt retinerea valorilor citite - Subprogramul apeleaza functia recursive T, care elimina cifrele imparee ale unei valori transmise caparametru - Ex: n=5 si valorile 1324, 4325, 4356, 492181, 32474 se va afisa: 244, 428, 46, 42, 24 - Solutie: o Functia T primeste o valoare naturala prin intermediul unui parametru valoare intreg lung. Acesta va I parcurs cifra cu cifra, valoarea returnata de functie reprezentand un numar creat doar de cifrele lui pare o Subprogramul M are un singur parametru intreg i, care indica numarul de ordine al numarului citit ; acesta va fi memorat in variabila locala x; numarul returnat in urma apelului T(x) va fi afisat la revenirea din recursivitate

program n3; {afisarea in ordine inversa a n valori citite din care au fost sterse cifrele impare ex: n=5 si val:1324, 4325, 4356, 492181, 32474 va afisa: 244, 428, 46, 42, 24 } var n,i:integer; function T(x:longint):longint; {elimina cifrele impare din nr x} begin if x=0 then T:=0 else if x mod 2=0 then T:=x mod 10 + 10*T(x div 10) else T:=T(x div 10); end; procedure M(i:byte); {afiseaza, in ord inversa, valorile citite din care au fost sterse cifrele impare} var x:longint; begin if i<=n then begin write('x='); readln(x); M(i+1); write(T(x),' ') end; end; begin write('n='); readln(n); M(1); readln; end.

Recursivitate

prof. Craina Sanda

4. Realizati un subprogram recursive NR care permite citirea a n siruri de caractere de lungimi egale si care returneaza, prin intermediul unui parametru, numarul de siruri care sunt anagrame cu ultimul citit. Indic: - Fara vectori - In subprogram se va apela functia OK, care verifica daca doua siruri de caractereprimite prin intermediul a 2 parametri sunt anagrame - Functia OK returneaza true sau false - Ex: n=4 si sirurile: arc, rac, dar, car subprogramul NR intoarce printr-un parametru intreg valoarea 2 - Solutie: o Functia OK cauta succesiv primul character al parametrului a, in cel de al doilea (b); in cazul in care este gasit va fi sters si din a si din b, functia autoapelandu-se pt noile valori ale parametrilor; procedeul se continua fie pana cand caracterul nu este gasit, caz in care functia returneaza valoarea False, fie cand lungimea lui a este 0, caz in care cuvinatele sunt anagrame o Subprogramul NR va avea 2 parametri de referinta: Parametrul intreg m, care contorizeaza numarul de cuvinte anagrame cu ultimul sir citit Parametrul sir de caractere y, care va retine ultimul sir de caractere citit La revenirea din autoapeluri, parametrul m isi mareste valoarea cu o unitate, daca la apelul OK(x,y) se returneaza valoarea True; parametrul efectiv x va transmite, la fiecare apel, sirul de caractere citit la pasul current

program n4; {afisarea in ordine inversa a n valori citite din care au fost sterse cifrele impare ex: n=5 si val:1324, 4325, 4356, 492181, 32474 va afisa: 244, 428, 46, 42, 24 } var n,i:integer; function T(x:longint):longint; {elimina cifrele impare din nr x} begin if x=0 then T:=0 else if x mod 2=0 then T:=x mod 10 + 10*T(x div 10) else T:=T(x div 10); end; procedure M(i:byte); {afiseaza, in ord inversa, valorile citite din care au fost sterse cifrele impare} var x:longint; begin if i<=n then begin write('x='); readln(x); M(i+1); write(T(x),' ') end; end; begin write('n='); readln(n); readln; end.

M(1);

S-ar putea să vă placă și