Professional Documents
Culture Documents
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
2 ore laborator titular aplicaii practice
______________________
Cteva precizri
Forme de examinare:
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
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
Exemplu
void p (list de parametri){
lista variabile locale
if (conditie) p(list de parametri) ...
sau:
...
while (conditie)
p(list de parametri); { ...p(list de parametri) }
sau:
}
do { ... p(list de parametri)... } while
(conditie)
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
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
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>
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:
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
#include<iostream.h>
int a[100],n,i;
int max(int x, int y)
{
if(x > y) return x;
else return y;
}
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;
void baza(int n)
{
if(n<b) cout<<n;
else
{
baza(n/b);
cout<<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
#include<iostream.h>
#include<string.h>
char n[255],i,l;
void invers(int i)
{
if(i<l) invers(i+1);
cout<<n[i];
}
int main(void)
{
cout<<"Dati numarul in n = ";
cin>>n;
l=strlen(n);
cout<<"Numarul rasturnat
este ";
invers(0);
}
40
1
Executia programului pentru o valoare de test:
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.
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
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