Documente Academic
Documente Profesional
Documente Cultură
Î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ă?
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;
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
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: NN,
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).
AR, n=3, *** AR, n=3, *** AR, n=3, *** AR, n=3, ***
Eliberarea stivei
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
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)=3incons(4)=34incons(5)=345incons(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ţă .