Sunteți pe pagina 1din 4

CUCENIC ION

Întrebări şi exerciţii
1. Explicaţi termenul tehnicii de programare.
Tehnicile de programare reprezinta niste metode de progrmare care se bazeaza pe
un anumite algoritme ce permit rezolvarea unei probleme mai rational, mai
repede sau mai clar.
2. Care este diferenţa dintre recursia directă şi recursia indirectă! Daţi exemple.
In cazul în care auto-apelul se realizează în cadrul aceleiași funcții, recursivitatea
este directă (A->A).Atunci când auto-apelul se realizează prin intermediul altei
funcții, recursivitatea este indirectă (A->B->...->A)

3.Ce condiţii trebuie respectate pentru ca definiţia unui algoritm recursiv să fie corectă?

Ca definitia unui algoritm recursiv sa fie corecta trebuia ca sa existe :cazuri


elementare care se rezolva direct si cazuri care nu se rezolva direct,insa procesul de
calcul in mod obligatoriu progreseaza spre un caz elementar

4.Care este diferenţa dintre definiţiile recursive consistente şi definiţiile recursive


inconsistente?
Diferenţa dintre definiţiile recursive consistente şi definiţiile recursive
inconsistente este ca in cazul celor consistente solutia poate fi calculata direct iar
in cazul celor inconsistente –nu si poate dura un timp indelungat pana nu va fi
oprita.

Se consideră următoarele definiţii recursive de funcţii. Care din aceste definiţii sunt
consistente? Argumentaţi răspunsul.
a) f : N  N, f  n 1, dacă n  0;
 
n  f  n  1 , dacă n  0; d) f : N  N, f  n 1, dacă n  0;
 
n  g  n  1 , dacă n  0;

b) f : N  N, f  n 1, dacă n  0;
 
n  f  n  , dacă n  0 e) g : N  N, 2, dacă n  0;
g  n  
n  f  n  1 , dacă n  0;

c) f : N  N, f  i 1, dacă i  0;
 
i  f  i  1 , dacă i  0; f) f : N  N, n, dacă n  10;
f  n  
 n mod 10   f  n div 10 , dacă n  0;

1) De realizat un studiu comparativ al subprogramelor Fibo_It și Fibo_Rec, care


rezolvă aceeași problemă, utilizând drept model tabelul 5.1 din manual (pag. 115),
adică calculați V(n), T(n), Q(n) și faceți concluziile necesare.

program fibonacci_iterativ_recursiv; function Fibo_Rec(n,a,b:natural):natural;


type natural=0..maxlongint; begin
var a,b,n:natural; nit1:=nit1+1;
nit,nit1:integer; if n>1
function Fibo_It(n:natural):natural; then Fibo_Rec:=Fibo_Rec(n-1,a+b,a)
var f,a,b:natural; else Fibo_Rec:=a+b;
begin end;
a:=0; b:=1; nit:=0; begin
while n>1 do write('dati n='); readln(n);
begin
f:=a+b; writeln(Fibo_It(n));
a:=b; b:=f; writeln('iteratii nit=',nit);
n:=n-1;
nit:=nit+1; a:=0; b:=1; nit1:=0;
end; writeln(Fibo_Rec(n,a,b));
Fibo_It:=f; writeln('iteratii nit1=',nit1);
end; end.

V(n)=5n) > V(n)=3n


T(n) = T(n)
Q(n)=7) > (Q(n)=5

 Necesarul de memorie in cazul programului recursiv este mai mare


 Timpul de executie e acelasi
 Programele recursive cat pentru mine sunt mai simple

Dragi elevi! Faceți cunoștință cu acest suport teoretic referitor la iterativitate versus recursivitate, încercați să
răspundeți la întrebări și să faceți un studiu comparativ a doi algoritmi. Sănătate tuturor! Succese!
Soluțiile le trimiteți pe adresa cunoscută gcurbet@gmail.com

UNITATEA 4. TEHNICI DE ELABORARE A ALGORITMILOR (Tehnici de programare)


TEMA. Iterativitate sau recursivitate

Constatări
Orice programator începă tor sau profesionist, posedă un anumit stil de programare, care de cele mai multe ori se
bazează pe creativitatea, intuiția și inteligența proprie, dar care nu mai corespunde cu cerințele actuale ale
activității de programare (complexitate redusă a algoritmilor, timp minim de execuție, eficiență algoritm ș.a.).
Activitatea de programare trebuie să devină o activitate sistematică cu etape bine precizate.
În aplicațiile reale apar probleme similare cu probleme cunoscute și pentru care se cunosc metode de rezolvare.
Problemele pot fi grupate în câ teva clase importante în funcție de specificul lor (proces de calcul) și de metodele
de rezolvare corespunză toare.
În funcţie de procesul de calcul necesar pentru rezolvarea unei probleme, există urmă toarele clase de probleme.
 Probleme de enumerare prin care se gă sesc toate soluțiile posibile (generarea tuturor permutărilor,
aranjamentelor, combinărilor unei mulţimi de numere).
 Probleme de decizie prin care se precizează dacă există sau nu cel puţin o soluţie (că utarea unei valori cu
proprietatea dată într-un şir de numere).
 Probleme de optimizare prin care se identifică soluţia optimă din mulţimea de soluţii posibile
(determinarea modalită ţii de plată a unei sume de bani S cu un numă r minim de bancnote).

Pe parcursul dezvoltă rii informaticii s-a stabilit că multe probleme de o reală importanţă practică pot fi rezolvate cu
ajutorul unor metode standard, denumite tehnici de elaborare a algoritmilor sau tehnici de programare:
 metoda trierii
 recursia
 metoda greedy
 metoda backtracking (reluării)
 metoda divide et impera (împarte și stăpânește)
 metoda programării dinamice
 metodele euristice ş.a.

Una din cele mai ră spâ ndite tehnici de programare este recursia.
Amintim că recursia se defineşte ca o situaţie în care un subprogram se autoapelează fie direct, fie prin intermediul
altui subprogram. Tehnicile în studiu se numesc respectiv recursia directă şi recursia indirectă, acestea fiind
studiate în cadrul temei "Funcţii şi proceduri".
În general, elaborarea unui program recursiv este posibilă numai atunci câ nd se respectă urmă toarea regulă de
consistenţă:
 soluţia problemei trebuie să fie direct calculabilă ori calculabilă cu ajutorul unor valori direct calculabile.

Cu alte cuvinte, definirea corectă a unui algoritm recursiv presupune că în procesul derulă rii calculelor trebuie să
existe:
 cazuri elementare, care se rezolvă direct;
 cazuri neelementare, care nu se rezolvă direct, însă procesul de calcul în mod obligatoriu progresează spre
un caz elementar.
De exemplu, în definiţia recursivă a funcţiei factorial fact: NN,
1, dacă n  0;
fact ( n )  
n  fact ( n  1), dacă n  0,

deosebim:
 Cazul elementar n=0. În acest caz valoarea fact(0) este direct calculabilă şi anume fact(0)=1.
 Cazurile neelementare n>0. În astfel de cazuri, valorile fact(n) nu sunt direct calculabile, însă procesul de
calcul progresează că tre cazul elementar fact(0).

De exemplu, pentru n=3 obţinem: fact(0)=3fact(2)=32fact(1)=321fact(0)=3211=6.


Prin urmare, definiţia recursivă a funcţiei fact(n) este o definiţie consistentă. Amintim, că funcţia fact(n) poate fi
exprimată în PASCAL, urmâ nd direct definiţia, în forma:
type natural=0..maxlongint;
function fact(n:natural):natural;
begin Evoluţia în stivă
if n=0 then fact:=1Fact(3) Fact(2) Fact(1) Fact(0)
else fact:=n*fact(n-1)
end;
AR, n=0, ***

AR, n=1, *** AR, n=1, ***

AR, n=2, *** AR, n=2, *** AR, n=2, ***

AR, n=3, *** AR, n=3, *** AR, n=3, *** AR, n=3, ***

Eliberarea stivei

Fact=1 Fact=1 Fact=2 Fact=6

AR, n=0, f=1

AR, n=1, *** AR, n=1, f=1

AR, n=2, *** AR, n=2, *** AR, n=2, f=2

AR, n=3, *** AR, n=3, *** AR, n=3, *** AR, n=3, f=6
Fig. 1 Gestionarea stivei în cazul apelului Fact(3):
AR – adresa de revenire; n – valoarea curentă a parametrului actual;
*** – spaţiu pentru memorarea valorii f returnate de funcţia Fact

Modul de gestionare a stivei în cazul apelului Fact(3) este prezentat în figura 1.


Într-un mod similar, în definiţia recursivă a funcţiei incons:NN,
1, dacă n  0,
incons n   
n  incons n  1 , dacă n  0,

deosebim cazul elementar n=0 şi cazurile neelementare n>0. Însă , spre deosebire de funcţia fact(n), pentru n>0
valorile incons(n) nu pot fi calculate, întrucâ t procesul de calcul progresează că tre incons().
De exemplu, pentru n=3 obţinem: incons(3)=3incons(4)=34incons(5)=345incons(6)=...

Prin urmare, definiţia recursivă a funcţiei incons(n) este o definiţie inconsistentă şi teoretic procesul de calcul va
dura la nesfâ rşit. În practică , calculele vor fi întrerupte de sistemul de operare în momentul depă şirii capacită ţii de
memorare a stivei sau în cazul depă şirii capacităţii dispozitivului aritmetic.
Accentuă m faptul că mediile actuale de programare nu asigură verificarea consistenţei algoritmilor recursivi, acest
lucru revenindu-i programatorului.

După cum s-a vă zut în capitolele precedente, orice algoritm recursiv poate fi transcris într-un algoritm iterativ şi
invers. Alegerea tehnicii de programare – iterativitate sau recursivitate – ţine, de asemenea, de competenţa
programatorului. Evident, această alegere trebuie fă cută luâ nd în considerare avantajele şi neajunsurile fiecă rei
metode, care variază de la caz la caz. Pentru exemplificare, în tabelul 1 sunt prezentate rezultatele unui studiu
comparativ al ambelor tehnici de programare în cazul prelucră rii automate a textelor.

Tabelul 1
Studiul comparativ al iterativităţii şi recursivităţii (prelucrarea automată a textelor)
Iterativitat Recursivitat
Nr. crt. Caracteristici
e e
1. Necesarul de memorie mic mare
2. Timpul de execuţie acelaşi
3. Structura programului complicată simplă
Volumul de muncă necesar pentru scrierea
4. mare mic
programului
5. Testarea şi depanarea programelor simplă complicată

În general, algoritmii recursivi sunt recomandaţi în special pentru problemele ale că ror rezultate sunt definite prin
relaţii de recurenţă : analiza sintactică a textelor, prelucrarea structurilor dinamice de date, procesarea imaginilor
ş.a. Un exemplu tipic de astfel de probleme este analiza gramaticală a programelor PASCAL, sintaxa că rora, după
cum se ştie, este definită prin relaţii de recurenţă .

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