Sunteți pe pagina 1din 48

Universitatea Constantin Brncui din Trgu-Jiu Facultatea de Inginerie Departamentul de Automatic, Energie i Mediu

PROIECTAREA ALGORITMILOR
Lect. univ. dr. Adrian Runceanu
1

Cteva precizri
Structura cursului
2 ore curs titular curs

Lector dr. Adrian Runceanu


1 or laborator titular aplicaii practice Asist. Ing. Constantin Cercel

Proiectarea Algoritmilor - curs

Cteva precizri
Forme de examinare:
Examen final 60% Evaluare pe parcursul semestrului a activitii de laborator 30% Prezen curs i laborator 10%

Proiectarea Algoritmilor - curs

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

Proiectarea Algoritmilor - curs

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

Proiectarea Algoritmilor - curs

Coninutul cursului
1. Conceptul de recursivitate 2. Recursivitate direct 3. Recursivitate indirect 4. Relaia dintre recursivitate i iteraie 5. Exemple de programe recursive

Proiectarea Algoritmilor - curs

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

Proiectarea Algoritmilor - curs

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.

Proiectarea Algoritmilor - curs

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.

Proiectarea Algoritmilor - curs

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.

Proiectarea Algoritmilor - curs

14

Coninutul cursului
1. Conceptul de recursivitate 2. Recursivitate direct 3. Recursivitate indirect 4. Relatia dintre recursivitate si iteratie 5. Exemple de programe recursive

Proiectarea Algoritmilor - curs

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.

Proiectarea Algoritmilor - curs

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

Proiectarea Algoritmilor - curs

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.

Proiectarea Algoritmilor - curs

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

Proiectarea Algoritmilor - curs

Coninutul cursului
1. Conceptul de recursivitate 2. Recursivitate direct 3. Recursivitate indirect 4. Relatia dintre recursivitate si iteratie 5. Exemple de programe recursive

Proiectarea Algoritmilor - curs

22

Relaia dintre recursivitate i iteraie - Comparaie


Iteraia
executia repetat a unei secvente de instructiuni o nou iteratie se execut doar n urma evalurii unei conditii (la nceput sau sfrsit) fiecare iteratie se execut pn la capt si apoi se trece, eventual, la o nou iteratie se recomand atunci cnd algoritmul de calcul este exprimat printr-o formul iterativ

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

Proiectarea Algoritmilor - curs

Coninutul cursului
1. Conceptul de recursivitate 2. Recursivitate direct 3. Recursivitate indirect 4. Relatia dintre recursivitate si iteratie 5. Exemple de programe recursive

Proiectarea Algoritmilor - curs

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

Proiectarea Algoritmilor - curs

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:

Proiectarea Algoritmilor - curs

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))

Proiectarea Algoritmilor - curs

30

#include<iostream.h>

long int suma(long int i) { if(i==1) return 1; else return suma(i-1)+i; }


int main(void) { long int n; cout<<"Introduceti n= "; cin>>n; cout<<"Suma primelor "<<n<<" numere este "<<suma(n)<<endl; }
Proiectarea Algoritmilor - curs

31

1
Executia programului pentru o valoare de test:

Proiectarea Algoritmilor - curs

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))

Proiectarea Algoritmilor - curs

33

#include<iostream.h> int a[100],n,i;


int max(int x, int y) { if(x > y) return x; else return y; } int maxim(int a[ ],int n) { if(n==1) return a[1]; else return max(a[n],maxim(a,n1)); }

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); }

Proiectarea Algoritmilor - curs

34

1
Executia programului pentru cateva valori de test:

Proiectarea Algoritmilor - curs

35

Probleme rezolvate

4. Sa se transforme un numar n, dat in baza 10, intr-o alta baza b (2<=b<=10).

Proiectarea Algoritmilor - curs

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); }

void baza(int n) { if(n<b) cout<<n; else { baza(n/b); cout<<n%b; } }

Proiectarea Algoritmilor - curs

37

1
Executia programului pentru cateva valori de test:

Proiectarea Algoritmilor - curs

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.

Proiectarea Algoritmilor - curs

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]; }

Proiectarea Algoritmilor - curs

40

1
Executia programului pentru o valoare de test:

Proiectarea Algoritmilor - curs

41

Probleme rezolvate
6. Suma puterilor rdcinilor

Fie ecuaia x2 - Sx + P = 0 cu S, P R si x1, x2 rdcinile ecuaiei. S se calculeze Sn= x1n + x2n , n N.

Proiectarea Algoritmilor - curs

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

Proiectarea Algoritmilor - curs

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

Proiectarea Algoritmilor - curs

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; }

Proiectarea Algoritmilor - curs

45

1
Executia programului pentru un set de valori de test:

Proiectarea Algoritmilor - curs

46

Probleme propuse spre rezolvare


1. S se scrie un program care s calculeze al n-lea termen din irul lui Fibonacci, care este definit recursiv astfel:
fib[1]=0 fib[2]=1 fib[n]=fib[n-1] + fib[n-2], pentru n>2

2. S se caute o soluie nerecursiv pentru irul lui Fibonacci.


Proiectarea Algoritmilor - curs

47

ntrebri?

Proiectarea Algoritmilor - curs

48

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