algoritmi recursivi

15
Algoritmi recursivi Structuri de date şi algoritmi 1 -laborator- s.l. dr. ing. Ciprian-Bogdan Chirilă Universitatea Politehnica Timişoara 2014

Upload: kaida

Post on 11-Jan-2016

42 views

Category:

Documents


0 download

DESCRIPTION

Algoritmi recursivi. Structuri de date şi algoritmi 1 - laborator - s.l . dr. ing. Ciprian-Bogdan Chiril ă Universitatea Politehnica Timi ş oara 2014. Cuprins. Ce este recursivitatea ? Verificarea şi simularea programelor recursive Tipuri de algoritmi recursivi - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Algoritmi recursivi

Algoritmi recursivi

Structuri de date şi algoritmi 1-laborator-

s.l. dr. ing. Ciprian-Bogdan ChirilăUniversitatea Politehnica Timişoara

2014

Page 2: Algoritmi recursivi

Cuprins Ce este recursivitatea ? Verificarea şi simularea programelor recursive Tipuri de algoritmi recursivi

Algoritmi de traversare a unei structuri Algoritmi care implementează definiţii recursive

factorial, Euclid, ridicarea la putere Algoritmi de divizare

quicksort, căutarea binară Algoritmi cu revenire (backtracking)

săritura calului, problema celor 8 regine aranjamente (cu/fără repetiţie), combinări “de m

luate câte n”

Page 3: Algoritmi recursivi

Ce este recursivitatea ? Recursivitatea presupune execuţia

repetată a unui modul; Pe parcursul său se verifică o condiţie a

cărei nesatisfacere implică reluarea execuţiei modulului de la începutul său;

Directă - un modul P conţine o referinţă la el însuşi;

Indirectă – un modul P conţine o referinţă la un modul Q ce include o referinţă la P;

Page 4: Algoritmi recursivi

Verificarea şi simularea programelor recursive Demonstraţie formală sau testând

toate cazurile posibile Se verifică cazurile particulare

(condiţia de terminare a apelurilor recursive)

Se verifică formal procedura recursivă pentru restul cazurilor

Verificarea se face prin inducţie

Page 5: Algoritmi recursivi

Exemplu - factorialint factorial(int n){

if(n==0){

// verificare pentru n=0 n!=1return 1;

}else{

// verificare pentru n>0 n!=n*(n-1)!return n*factorial(n-1);

}}

Page 6: Algoritmi recursivi

Algoritmi care implementează definiţii recursiveExemplu – algoritmul lui Euclid

int cmmdc(int x,int y){

if(x<y){

int aux=x;x=y;y=aux;

}if(y!=0){

return cmmdc(y,x%y);}return x;

}

Page 7: Algoritmi recursivi

Algoritmi de traversare a unei structuri

void traversare(tip_element element)/* apelul initial al procedurii se face cu primelement

al structurii */{ prelucrare(element); if element != ultimul_din_structura

traversare(element_urmator);}

Page 8: Algoritmi recursivi

Algoritmi de divizarevoid rezolva(problema x){ if /* x e divizibil in subprobleme */ { /* divide pe x in parti x1,...,xk */

rezolva(x1); /*…*/ rezolva(xk);

/* combina solutiile partiale intr-o solutie pentru x */ } else /* rezolva pe x direct */ }

Page 9: Algoritmi recursivi

Algoritmi cu revenire (backtracking)

x=(x1,x2,...xn) € S=S1 x S2 x...x Sn

S – spaţiul soluţiilor posibile condiţii interne – relaţii între

componentele vectorului x

Page 10: Algoritmi recursivi

Algoritmi cu revenire (backtracking)void backtracking(int i) //gaseste valoarea lui xi

int posibilitate; //pentru toate valorile posibile ale lui xi

{ for(posibilitate=1;posibilitate<=M;posibilitate++) { if(acceptabila) { inregisteaza_posibilitatea; if(i < n)backtracking(i+1) else afiseaza_solutia; sterge_inregistrarea } } }

Page 11: Algoritmi recursivi

Exemplu - aranjamenteint valid(int p){ if(p>0) { return tab[p]!=tab[p-1]; } return 1;}

void aranjamente(int k){ int i; if(k<n) { for(i=1;i<=m;i++) { tab[k]=i; if(valid(k))aranjamente(k+1); } } else print();}

Page 12: Algoritmi recursivi

Exemplu – combinăriint valid(int p){ if(p>0) { return tab[p]>tab[p-1]; } return 1;}

void aranjamente(int k){ int i; if(k<n) { for(i=1;i<=m;i++) { tab[k]=i; if(valid(k))aranjamente(k+1); } } else print();}

Page 13: Algoritmi recursivi

Exemplu – 8 regine (1)void dame(int k){int i; if(k<n) { for(i=0;i<n;i++) { if(valid(k,i)) { tab[k]=i; dame(k+1); } } } else {print();}}

Page 14: Algoritmi recursivi

Exemplu – 8 regine (2)int valid(int k,int i){ int j; for(j=0;j<k;j++) { if(tab[j]==i){return 0;} if(abs(j-k)==abs(tab[j]-i)){return 0;} } return 1;}

Page 15: Algoritmi recursivi

Exemplu - săritura caluluivoid cal(int x,int y,int pas){

if(!gata){

tab[x][y]=pas;if(pas==n*n){

print();gata=1;return;

}if((tab[x+1][y+2]==0)&&(x+1<=n)&&(y+2<=n))cal(x+1,y+2,pas+1);if((tab[x+2][y+1]==0)&&(x+2<=n)&&(y+1<=n))cal(x+2,y+1,pas+1);if((tab[x-1][y-2]==0)&&(x-1>=1)&&(y-2>=1))cal(x-1,y-2,pas+1);if((tab[x-2][y-1]==0)&&(x-2>=1)&&(y-1>=1))cal(x-2,y-1,pas+1);if((tab[x-1][y+2]==0)&&(x-1>=1)&&(y+2<=n))cal(x-1,y+2,pas+1);if((tab[x-2][y+1]==0)&&(x-2>=1)&&(y+1<=n))cal(x-2,y+1,pas+1);if((tab[x+1][y-2]==0)&&(x+1<=n)&&(y-2>=1))cal(x+1,y-2,pas+1);if((tab[x+2][y-1]==0)&&(x+2<=n)&&(y-1>=1))cal(x+2,y-1,pas+1);tab[x][y]=0;

}}