Documente Academic
Documente Profesional
Documente Cultură
PROIECTAREA ALGORITMILOR
Lect. univ. dr. Adrian Runceanu
1
Cteva precizri
Structura cursului
2 ore curs titular curs
Cteva precizri
Forme de examinare:
Examen final 60% Evaluare pe parcursul semestrului a activitii de laborator 30% Prezen curs i laborator 10%
Cteva precizri
Bibliografia necesar cursului:
1. Dogaru, O., Tehnici de programare, Editura MIRTON, Timioara, 2002, 2004 2. Creu, V., Structuri de date i algoritmi, vol.1 Structuri de date fundamentale, Editura Orizonturi Universitare, Timioara, 2000 3. Livovschi, L.,Georgescu, H., Sinteza i Analiza algoritmilor, Editura tiinific i Enciclopedic, Bucureti, 1986 4. Wirth, N., Algorithms and Data Structures, Prentice Hall, Inc.,Englewood, New Jersey, 1986 5. Dr. Kris Jamsa & Lars Klander, Totul despre C si C++ - Manualul fundamental de programare n C si C++, ed. Teora, 1999-2006
Proiectarea Algoritmilor - curs
Cteva precizri
Bibliografia necesar cursului:
6. Liviu Negrescu, Limbajele C si C++ pentru nceptori, vol. II, Limbajul C++, ed. MicroInformatica, 1995 7. A.Runceanu, Metode si tehnici de programare indrumar de laborator, Editura Academica Brancusi Targu-Jiu, 2003 8. Horia Ciocrlie, Tehnici fundamentale de programare, Ed. Orizonturi Universitare, 2002 9. Pagina web pentru curs:
http://www.runceanu.ro/adrian
Cteva precizri
Referinele bibliografice nr. 1 i 7 se pot mprumuta de la Biblioteca Facultii de Inginerie, Str. Geneva nr.3, Etaj I lng Decanat. 1. Suport curs - varianta electronic disponibil pe siteul:
http://www.runceanu.ro/adrian
2. ndrumar de laborator - varianta electronic disponibil pe site pentru fiecare lucrare de laborator. Not: Actualizarea site-ului se face sptmnal.
Proiectarea Algoritmilor - curs
Coninutul cursului
n cadrul acestui curs se vor studia metode i tehnici de programare pentru elaborarea eficient a algoritmilor. Exemplificrile de la curs i implementrile de la laborator se vor efectua cu ajutorul limbajului de programare - C++. Mediul de dezvoltare utilizat la aplicatiile practice este MinGW.
Proiectarea Algoritmilor - curs
Capitolele cursului
1. 2. 3. 4. 5. 6. 7. 8. Recursivitate Alocarea dinamic de memorie n C++ Liste simplu i dublu nlnuite Elemente de teoria grafurilor Algoritmi pentru prelucrarea grafurilor Arbori. Arbori binari Metoda greedy de elaborare a algoritmilor Metoda Divide et Impera de elaborare a algoritmilor 9. Metoda Backtracking de elaborare a algoritmilor. Aplicaii 10. Combinatoric
Proiectarea Algoritmilor - curs
Curs 1
Recursivitate
Coninutul cursului
1. Conceptul de recursivitate 2. Recursivitate direct 3. Recursivitate indirect 4. Relaia dintre recursivitate i iteraie 5. Exemple de programe recursive
10
1. Conceptul de recursivitate
Un obiect sau un fenomen este definit n mod recursiv dac n definitia sa se face referire la el nsusi. Conceptul de recursivitate ofer posibilitatea definirii unei infinitti de obiecte printr-un numr finit de relatii. O functie este recursiv atunci cnd executarea ei implic cel putin nc un apel ctre ea nssi.
11
1. Conceptul de recursivitate
Tipuri de recursivitate:
1. Recursivitate direct apelul recursiv se face chiar din functia invocat. 2. Recursivitate indirect (mutual) apelul recursiv se realizeaz prin intermediul mai multor functii care se apeleaz circular.
12
Exemplul 1
Definirea numerelor naturale: 1 este numr natural succesorul unui numr natural este un numr natural Se presupune cunoscut definiia succesorului unui numr: acel numr obinut din numrul dat prin adugarea unei uniti.
13
Exemplul 2
Algoritm de calcul pentru factorialul unui numr N. (notatie N!): dac N = 0 atunci N! = 1 dac N > 0 atunci N! = N * (N-1)! Astfel spus, factorialul unui numr N > 0 se obine prin nmulirea numrului cu factorialul predecesorului.
14
Coninutul cursului
1. Conceptul de recursivitate 2. Recursivitate direct 3. Recursivitate indirect 4. Relatia dintre recursivitate si iteratie 5. Exemple de programe recursive
15
Recursivitate direct
n limbajul C++ functiile se pot apela pe ele nsele, adic sunt direct recursive. Pentru o functionare corect (din punct de vedere logic), apelul recursiv trebuie s fie conditionat de o decizie care, la un moment dat n cursul executiei, s mpiedice continuarea apelurilor recursive si s permit astfel revenirea din sirul de apeluri.
Proiectarea Algoritmilor - curs
16
Recursivitate direct
Lipsa acestei conditii sau programarea ei gresit va conduce la executarea unui sir de apeluri a crui terminare nu mai este controlat prin program si care, la epuizarea resurselor sistemului, va provoca o eroare de executie: Depsirea stivei de date.
17
1 void p (list de parametri){ lista variabile locale if (cond) p(list de parametri) ... sau: ... while (cond) { ...p(list de p(list de parametri); parametri) } sau: } do ... p(list de parametri)... while
(cond)
Exemplu
Conditia care trebuie testat este specific problemei de rezolvat. Programatorul trebuie s o identifice n fiecare situatie concret si, pe baza ei, s redacteze corect apelul recursiv. Revenirea din apeluri se face n ordine invers. 18
Coninutul cursului
1. Conceptul de recursivitate 2. Recursivitate direct 3. Recursivitate indirect 4. Relatia dintre recursivitate si iteratie 5. Exemple de programe recursive
19
Recursivitate indirect
Un subprogram S, n corpul cruia apar apeluri la S (la el nsui) se numete subprogram direct recursiv iar un subprogram P, pentru care exist un subprogram Q, astfel nct P face apeluri la Q, iar Q conine apelul la P se numete subprogram indirect recursiv. n acest ultim caz, subprogramele P i Q se mai numesc i mutual recursive.
20
Recursivitate indirect
Funcie direct recursiv functia S; { S; // apel la functia S }
Funcii mutual recursive functia P; { Q ; // apel la functia Q } functia Q; { P ; // apelul functiei P }
21
Coninutul cursului
1. Conceptul de recursivitate 2. Recursivitate direct 3. Recursivitate indirect 4. Relatia dintre recursivitate si iteratie 5. Exemple de programe recursive
22
Recursivitatea
executia repetat a unei functii un nou apel recursiv se execut tot n urma evalurii unei conditii (pe parcurs) functia recursiv se apeleaz din nou, nainte de terminarea apelului precedent se recomand doar atunci cnd problema este prin definitie recursiv (recursivitatea consum resurse n exces)
23
Coninutul cursului
1. Conceptul de recursivitate 2. Recursivitate direct 3. Recursivitate indirect 4. Relatia dintre recursivitate si iteratie 5. Exemple de programe recursive
24
Probleme rezolvate
1. Se dau doua numere intregi a si b si se cere sa se calculeze cel mai mare divizor comun. (Algoritmul lui EUCLID prin mpriri repetate). Formularea recursiv, n cuvinte, a algoritmului: Dac unul dintre numere este zero, c.m.m.d.c. al lor este cellalt numr. Dac nici unul dintre numere nu este zero, atunci c.m.m.d.c. nu se modific dac se nlocuieste unul dintre numere cu restul mprtirii sale cu cellalt.
Proiectarea Algoritmilor - curs
25
Probleme rezolvate
Algoritmul poate fi implementat sub forma urmtoarei functii recursive: int cmmdc (int n, int m) { if (n==0) return m; else return cmmdc(n, m % n); }
26
Probleme rezolvate
Codul sursa al implementarii (varianta prin scaderi succesive) este urmatorul: #include<iostream.h>
int cmmdc(int a,int b) { if(a==b) return a; else if(a>b) return cmmdc(a-b, b); else return cmmdc(a, b-a); }
Proiectarea Algoritmilor - curs
27
int main(void) { int a, b; char c; do { cout<<"Introduceti a= "; cin>>a; cout<<"Introduceti b= "; cin>>b; cout<<"C.m.m.d.c. "<<a<<","<<b<<" este "<<cmmdc(a,b)<<endl; cout<<"Mai doriti sa calculati pentru alte valori? (d/n) "; cin>>c; }while( toupper(c)!='N' ); }
Proiectarea Algoritmilor - curs
28
1
Executia programului pentru cateva date de test:
29
Probleme rezolvate
2. S se calculeze suma primelor n numere naturale.
Soluia este dat de relaia de recuren: suma(1, 2, . . . , n) = suma(n, suma(1, 2, . . . , n-1))
30
#include<iostream.h>
31
1
Executia programului pentru o valoare de test:
32
Probleme rezolvate
3. S se afle elementul maxim dintr-un vector dat. Soluia este dat de relaia de recuren: maxim(a1, a2 , . . . ,an) = maxim(an, maxim(a1, a2, . . . , an-1))
33
1
int main(void) { cout<<"Introduceti dimensiunea sirului n = "; cin>>n; for(i=1;i<=n;i++) { cout<<"a["<<i<<"]="; cin>>a[i]; } cout<<"Elementul maxim din vector este = "<<maxim(a,n); }
34
1
Executia programului pentru cateva valori de test:
35
Probleme rezolvate
36
1
#include<iostream.h> int n,b; int main(void) { cout<<"Dati numarul in baza 10, n = "; cin>>n; cout<<"Dati baza in care vreti sa se transforme "; cin>>b; cout<<n<<" in baza "<<b<<" este "; baza(n); }
37
1
Executia programului pentru cateva valori de test:
38
Probleme rezolvate
5. Se citeste un numar intreg ca un sir de caractere cu cel mult 255 cifre. Sa se afiseze numarul cu cifrele in ordine inversa.
39
1
#include<iostream.h> #include<string.h> int main(void) { cout<<"Dati numarul in n = "; cin>>n; l=strlen(n); cout<<"Numarul rasturnat este "; invers(0); }
char n[255],i,l;
void invers(int i) { if(i<l) invers(i+1); cout<<n[i]; }
40
1
Executia programului pentru o valoare de test:
41
Probleme rezolvate
6. Suma puterilor rdcinilor
42
1 Cutm relaia de recuren pentru Sn, tiind c x1, respectiv x2 sunt rdcinile ecuaiei date i deci ndeplinesc relaiile: x12 - Sx1 + P = 0 | * x1n-2 x22 - Sx2 + P = 0 | * x2n-2 nmulim aceste relaii cu x1n-2 i x2n-2 i adunm relaiile obinute i rezult: Sn = x1n + x2n = = S * (x1n-1 + x2n-1 ) P * (x1n-2 + x2n-2 ) = = S * Sn-1 - P * Sn-2
43
Astfel am obinut o relaie de recuren: S0 = x11 + x21 = 1 + 1 = 2, pentru n=0 S1 = x11 + x21 = S, pentru n=1 Sn = S * Sn-1 - P * Sn-2, pentru n 2
44
1
#include<iostream.h> int n; float s,p,r; float suma(int n) { if(n==0) return 2; else if(n==1) return s; else return(s*suma(n-1)p*suma(n-2)); } int main(void) { cout<<"Introduceti valorile ecuatiei de gradul II "<<endl; cout<<"Dati s = ";cin>>s; cout<<"Dati p = ";cin>>p; cout<<" N = ";cin>>n; r=suma(n); cout<<"Valoarea lui S("<<n<<") este "<<r; }
45
1
Executia programului pentru un set de valori de test:
46
47
ntrebri?
48