Sunteți pe pagina 1din 66

nvmntul profesional i tehnic n domeniul TIC Proiect cofinanat din Fondul Social European n cadrul POS DRU 2007-2013

Beneficiar Centrul Naional de Dezvoltare a nvmntului Profesional i Tehnic


str. Spiru Haret nr. 10-12, sector 1, Bucureti-010176, tel. 021-3111162, fax. 021-3125498, vet@tvet.ro

METODE I TEHNICI CLASICE DE PROGRAMARE Material de nvare partea I


Domeniul: Informatic Calificarea: Analist programator Nivel 3 avansat

2009

AUTOR: ROMANA SLJAN Profesor grad didactic I

COORDONATOR: MARIANA VIOLETA CIOBANU Profesor, grad didactic II, Colegiul Tehnic Media Bucureti

CONSULTAN: IOANA CRSTEA expert CNDIPT GABRIELA CIOBANU expert CNDIPT ANGELA POPESCU expert CNDIPT DANA STROIE expert CNDIPT

Acest material a fost elaborat n cadrul proiectului nvmntul profesional i tehnic n domeniul TIC, proiect cofinanat din Fondul Social European n cadrul POS DRU 20072013

Cuprins
I. Introducere....................................................................................................................................5 II. Resurse........................................................................................................................................9 Tema 1. Recursivitate- noiuni generale...................................................................................10 Fia de documentare 1.1 Elementele recursivitii................................................................10 Activitatea de nvare 1.1 Identificarea unor procese recursive...........................................13 Activitatea de nvare 1.2 Ordinea de execuie a funciilor recursive..................................13 Tema 2. Recursivitate i iterativitate ........................................................................................15 Fia de documentare 2.1 Algoritmi care implementeaz definiii recursive ........................15 Activitatea de nvare 2.1 Identificarea definiiei recursive corecte....................................17 Activitatea de nvare 2.2 Condiia de terminarare .............................................................18 Activitatea de nvare 2.3 Identificarea soluiei corecte ......................................................19 Activitatea de nvare 2.4 Aplicarea definiiei recursive......................................................20 Fia de documentare 2.2 Algoritmi de traversare, inversare a unei structuri........................21 Activitatea de nvare 2.5 Existena unui element(1)...........................................................22 Activitatea de nvare 2.6 Existena unui element(2) ..........................................................22 Activitatea de nvare 2.7 Existena unui element(3)...........................................................23 Activitatea de nvare 2.8 Determinarea algoritmului pseudocod .......................................24 Fia de documentare 2.3 Tipuri de algoritmi de divizare......................................................26 Activitatea de nvare 2.9 Cutare binar.............................................................................27 Fia de documentare 2.4 Tipuri de algoritmi recursivi cu revenire.......................................29 Activitatea de nvare 2.10 Permutari..................................................................................30 Activitatea de nvare 2.11 Dame.........................................................................................31 Activitatea de nvare 2.12 Partiii.......................................................................................32 Fia de documentare 2.5 Algoritmi iterativi i recursivi.......................................................34 Activitatea de nvare 2.13 Metode iterative i recursive ...................................................35 Activitatea de nvare 2.14 Tratare comparativ .................................................................35 Tema 3. Avantajele i dezavantajele recursivitii ...................................................................37 Fia de documentare 3.1 Eliminarea recursivitii.................................................................37 Activitatea de nvare 3.1 irul lui Fibonacci......................................................................37 Activitatea de nvare 3.2 Recursivitate indirect ..............................................................38 Tema 4. Tehnica de programare Divide et Impera...................................................................40 Fia de documentare 4.1 Descriere general ........................................................................40 Activitatea de nvare 4.1 Divide et Impera.........................................................................41 Fia de documentare 4.2 Aplicaii practice ...........................................................................43 Activitatea de nvare 4.2 Maximul dintr-un ir...................................................................43 Activitatea de nvare 4.3 Cutare binar..........................................................................44 Activitatea de nvare 4.4 Sortarea prin interclasare...........................................................45 Activitatea de nvare 4.5 Turnurile din Hanoi...................................................................46 Tema 5. Tehnica de programare Backtracking .........................................................................48 Fia de documentare 5.1 Descrierea tehnicii standard (iterativ)...........................................48 Activitatea de nvare 5.1 Rutina de backtracking .............................................................49 Activitatea de nvare 5.2 Problema damelor......................................................................50 Fia de documentare 5.2 Aplicaii practice............................................................................51 Activitatea de nvare 5.3 Generarea permutrilor..............................................................51 Activitatea de nvare 5.4 Generarea aranjamentelor..........................................................52 Activitatea de nvare 5.5 Generarea combinrilor.............................................................52 Activitatea de nvare 5.6 Problema colorrii hrilor.........................................................53 Activitatea de nvare 5.7 Problema comis- voiajorului.....................................................55 Fia de documentare 5.3 Backtracking recursiv....................................................................57

Activitatea de nvare 5.8 Problema damelor rezolvat recursiv........................................57 Activitatea de nvare 5.9 Probleme rezolvate recursiv......................................................59 Tema 6. Tehnica de programare Greedy ..................................................................................60 Fia de documentare 6.1 Descrierea tehnicii........................................................................60 Activitatea de nvare 6.1 Exerciii de fixare a cunotinelor teoretice...............................61 Activitatea de nvare 6.2 Problema spectacolelor..............................................................62 Activitatea de nvare 6.3 Problema continu a rucsacului.................................................63 III. Glosar.......................................................................................................................................65 IV. Bibliografie..............................................................................................................................66 ......................................................................................................................................................66

I. Introducere
Materialul de nvare are rolul de a conduce elevul la dobndirea competenelor din unitatea de competen tehnic specializat Utilizarea metodelor i tehnicilor clasice de programare din cadrul structurii programului pentru nivel 3 avansat. Coninuturile ce trebuie parcurse pentru a putea construi aceste competene, apar n programa modulului i sunt corelate cu Criteriile de Performan i Condiiile de Aplicabilitate din Standardul de Pregtire Profesional pentru unitile de competen corespunztoare modulului. Domeniul : Informatic Calificarea : Analist programator Nivelul de calificare : 3 avansat Materialul cuprinde: - fie de documentare - activiti de nvare - glosar Prezentul material de nvare, se adreseaz elevilor din cadrul colilor postliceale, domeniul Informatic, calificarea Analist programator. Coninuturile ce trebuie parcurse pentru a putea construi aceste competene, apar n programa modulului i sunt corelate cu Criteriile de Performan i Condiiile de Aplicabilitate din Standardul de Pregtire Profesional pentru unitile de competen corespunztoare modulului. Tabelul de corelare a competenelor corespunztoare coninuturilor Competena / Rezultatul nvrii Aplic principiile recursivitii i iterativitii n rezolvarea problemelor Tema 2 Recursivitate i iterativitate Teme Elemente componente Tema 1 Recursivitate- noiuni generale Fia de documentare 1.1: Elementele recursivitii Activitatea de invare 1.1. Identificarea unor procese recursive Activitatea de invare 1.2. Ordinea de execuie a funciilor recursive Fia 2.1 Algoritmi care implementeaz definiii recursive Activitatea de nvare 2.1 Identificarea definiiei recursive corecte cu temele i fiele documentare

Competena / Rezultatul nvrii

Teme

Elemente componente Activitatea de nvare 2.2 Condiia de terminare Activitatea de nvare 2.3 Identificarea soluiei corecte Activitatea de nvare 2.4 Aplicarea definiiei recursive Fia de documentare 2.2 Algoritmi de traversare, inversare a unei structuri Activitatea de nvare 2.5 Existena unui element(1) Activitatea de nvare 2.6 Existena unui element(2) Activitatea de nvare 2.7 Existena unui element(3) Activitatea de nvare 2.8 Determinarea algoritmului pseudocod Fia de documentare 2.3 Tipuri de algoritmi de divizare Activitatea de nvare 2.9 Cutare binar Fia de documentare 2.4 Tipuri de algoritmi recursivi cu revenire Activitatea de nvare 2.10 Permutri Activitatea de nvare 2.11 Dame Activitatea de nvare 2.12 Partiii Fia de documentare 2.5 Algoritmi iterativi i recursivi Activitatea de nvare 2.13 Metode iterative i recursive

Competena / Rezultatul nvrii

Teme

Elemente componente

Activitatea de nvare 2.14 Tratare comparativ Tema 3 Avantajele i dezavantajele Fia 3.1 Eliminarea utilizrii recursivitii recursivitii Activitatea de nvare 3.1 irul lui Fibonacci Activitatea de nvare 3.2 Recursivitate indirect Utilizeaz tehnicile clasice de programare Tema 4 Tehnica de programare " Divide et Impera " Fia 4.1 Descriere general Activitatea de nvare 4.1 Divide et impera Fia 4.2 Aplicaii practice Activitatea de nvare 4.2 Maximul dintr-un ir

Activitatea de nvare 4.3 Cutare binar Activitatea de nvare 4.4 Sortarea prin interclasare Activitatea de nvare 4.5 Turnurile din Hanoi Tema 5 Tehnica de programare Backtracking Fia 5.1 Descrierea tehnicii Activitatea de nvare 5.1 Rutina de backtracking Activitatea de nvare 5.2 Problema damelor Fia 5.2 Aplicaii practice Activitatea de nvare 5.3 Generarea permutrilor Activitatea de nvare 5.4 Generarea aranjamentelor Activitatea de nvare 5.5 Generarea combinrilor Activitatea de nvare 5.6 Problema colorrii hrilor

Competena / Rezultatul nvrii

Teme

Elemente componente Activitatea de nvare 5.7 Problema comis- voiajorului Fia 5.3 Backtracking recursiv Activitatea de nvare 5.8 Problema damelor rezolvat recursiv Activitatea de nvare 5.9 Probleme rezolvate recursiv Fia 6.1 Descrierea tehnicii Activitatea de nvare 6.1 Exerciii de fixare a cunotinelor teoretice Activitatea de nvare 6.2 Problema spectacolelor

Tema 6 Tehnica de programare Greedy

Activitatea de nvare 6.3 Problema continu a rucsacului Absolventul nivelului 3 avansat, coal postliceal, calificarea Analist programator, va fi capabil s aplice principiile recursivitii i iterativitii n rezolvarea problemelor i s utilizeze tehnicile clasice de programare.

II. Resurse
Prezentul material de nvare cuprinde diferite tipuri de resurse care pot fi folosite de elevi: fie de documentare activiti de nvare

Elevii pot folosi att materialul prezent (n forma printat) ct i varianta echivalent online.

Tema 1. Recursivitate- noiuni generale


Fia de documentare 1.1 Elementele recursivitii
Recursivitatea este una din noiunile fundamentale ale informaticii. Utilizarea frecvent a recursivitii s-a fcut dup anii 80. Definiie Procesul recursiv este procesul care n timpul execuiei, genereaz apariia unor procese identice aflate n legtur direct cu procesul ce le genereaz. Aceste procese pot fi finite si infinite. Un proces recursiv finit este caracterizat printr-o aciune care se repet, un motor care susine aceast activitate i o condiie de oprire. n cazul proceselor infinite lipsete condiia de oprire, aciunea generndu-se n mod continuu. Un proces recursiv poate fi descris printr- un subprogram. Definiie Recursivitatea este un mecanism general de elaborare a programelor, care const n posibilitatea ca un subprogram s se autoapeleze. A aprut din necesiti practice date de transcrierea direct a formulelor matematice recursive. Astzi este utilizat n elaborarea multor algoritmi.

Sugestii metodologice Caut exemple intuitive de procese recursive din realitatea cotidian. De exemplu: 1. O camer de luat vederi are n obiectiv un televizor care transmite imaginile primite de la camer. Evident, n televizor se va vedea un televizor iar n acesta, un televizor,.a.m.d. Pe scurt, n orice televizor se vede un televizor. 2. n anumite restaurante ntlnim anunul Azi nu se fumeaz . 3. Respiraia este un proces recursiv. Atunci cnd scri un algoritm recursiv, este suficient s gndeti exact ce se ntmpl la un anumit nivel, pentru c la orice nivel se ntmpl exact acelai lucru. Un algoritm recursiv corect trebuie s se termine, contrar programul se va termina cu eroare i nu vei primi rezultatul ateptat. Procesele descrise prin subprogram sunt procese finite. Condiia de terminare este pus de ctre programator. Elementele recursivitii sunt: Procesul care se repet; Autoapelul(Motorul procesului); Condiia de terminare. A nu se uita condiia de terminare, de oprire a autoapelului procesului.

Este prezentat urmtorul fractal

, ce reprezint un copac cu dou

ramuri, care fac un unghi dat i au lungime egal cu jumtate din lungimea trunchiului, din care provin. Prin recursivitate copacul crete dup acelei reguli.

Sugestii metodologice Atenie, recursivitatea trebuie s fie definit corect, adic s ai o condiie de oprire. O greeal frecvent este nclcarea acestui principiu. Care este mecanismul intern al limbajului care permite ca un algoritm recursiv s poat fi implementat? Pentru a putea implementa recursivitatea, se folosete structura de date numit stiv care nu este gestionat de programator, ci chiar de limbaj. n fapt, o parte din memoria intern rezervat programului este rezervat stivei ( segmentului de stiv). Un registru al microprocesorului reine n permanen adresa bazei stivei, altul adresa vrfului ei. La apelul unui subprogram (funcii) care are x parametri efectivi, acetia se rein n stiv. Astfel, pentru parametrii transmii prin valoare se reine valoarea lor (din aceast cauz nu putem ntoarce valori utiliznd variabile transmise astfel- la revenire nu mai avem acces la stiv), iar pentru parametrii transmii prin referin se reine adresa lor (n stiv se rezerv spaiu pentru adres, iar coninutul va fi obinut prin utilizarea acesteia). Mecanismul prezentat mai sus poate fi generalizat cu uurin pentru obinerea recursivitaii. Atunci cnd o funcie se autoapeleaz se depun n stiv: valorile parametrilor transmii prin valoare; adresele parametrilor transmii prin referin; valorile tuturor variabilelor locale (declarate la nivelul procedurii sau funciei); adresa de revenire. Revenind la autoapel, s presupunem c funcia s-a autoapelat. Instruciunile rmn nemodificate. Funcia va lucra asupra datelor transmise pe stiv. n cazul unui nou autoapel, se creeaz un alt nivel pentru stiv, n care se depun noile valori. Odat ndeplinit condiia de terminare, urmeaz s se revin din autoapelri. Funcia care s-a autoapelat se reia de la instruciunea care urmeaz autoapelului. Ea va lucra cu variabilele (valorile) reinute pe stiv n momentul autoapelului, la care se adaug valorile returnate . Primul apel al subprogramului recursiv se realizeaz din exteriorul subprogramului

Sugestii metodologice S se afle termenul general al n-lea al irului cu termenul general a n= an-1+5, pentru n>1, tiind c primul termen din ir este 2, iar n se alege dintr-o list (1,2,...,6). Programul corespunztoare este: #include <iostream.h> int n; int termen(int n) {if(n==1) return 2; else return termen(n-1)+5; } void main() { do {cin>>n;} while (n<1 || n>6); cout<<termen(n); } Subprogramul termen este recursiv- se autoapeleaz din corpul su. Condiia de oprire este if(n==1) return 2, iar autoapelul este termen(n-1)+5. Pe stiv se depun adresa de revenire din apel i parametrul n .

Activitatea de nvare 1.1 Identificarea unor procese recursive


Competena: Aplic principiile recursivitii i iterativitii n rezolvarea problemelor Obiectivul vizat: S fii capabil s recunoti un proces recursiv; Durata: 10 minute

Tipul activitii: nvarea prin categorisire Sugestii Activitatea se poate face individual, un elev la cte un calculator, pe grupe sau n perechi. Sarcina de lucru Care din imaginile urmtoare i sugereaz procese recursive i care procese nerecursive?

somn,

arta,

diviziune celular

mers variat,

fractal,

sortare mere

Activitatea de nvare 1.2 Ordinea de execuie a funciilor recursive


Competena: Aplic principiile recursivitii i iterativitii n rezolvarea problemelor Obiectivul vizat: S fii capabil s determini ordinea de execuie a apelurilor unei funcii recursive care are mai multe autoapeluri n corpul ei. S fii capabil s determini ce se memoreaz pe stiv de fiecare dat. Durata: 20 minute

Tipul activitii: Studiu de caz Sugestii Activitatea se poate face individual, un elev la cte un calculator, pe grupe sau n perechi. Sarcina de lucru Se d urmatorul program: #include <iostream.h> int v[6]=(3,5,1,8,4,9,10,12); int impar(int n, int m) { if (n==m) return v[n]%2; else return impar(n,(n+m)/2)+impar((n+m)/2+1,m); } void main() { cout<<impar(0,7); } Precizeaz ordinea de efectuare a autoapelurilor n acest caz i valorile parametrilor memorai pe stiv la fiecare nivel, indicnd rezultatul obinut.

Tema 2. Recursivitate i iterativitate


Fia de documentare 2.1 Algoritmi care implementeaz definiii recursive

Definiie O definiie recursiv este definiia n care un obiect se definete prin el insui. Definiia conine condiia de prsire a definiiei i o parte ce precizeaz definirea recursiv propriu-zis.

Definiie Se numete recursivitate liniar recursivitatea in care nu pot aprea pe ramuri diferite ale execuiei programului mai multe apeluri recursive, adic pe un anumit nivel apare doar un singur apel recursiv.

Sugestii metodologice Aprofundeaz exemplele urmtoare, ruleaz-le n C++ pentru mai multe date de intrare i urmrete cu fereastra Watch ( Ctrl+F7) valorile parametrilor la fiecare apel al funciei recursive. Exemplu 1. Se dau dou numere naturale a i b.Se cere s se calculeze cel mai mare divizor comun al lor folosind algoritmul lui Euclid. Foloseti definiia recursiv a celui mai mare divizor comun pentru dou numere naturale a i b.

a, a = b Cmmdc(a,b)= cmmdc(a b, b), a > b cmmdc(a, b a), a < b


Formula este transcris n funcia recursiv cmmdc. 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); } Programul corespunztor care apeleaz funcia este: #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); } void main(){ int a,b; cout<<"Introduceti numerele: "; cin>>a>>b; cout<<"cmmdc dintre "<<a<<" i "<<b<<" este "<<cmmdc(a,b); } Exemplu 2. Fie fib: N N. S se calculeze fib(n), pentru n natural.

1, n = 0 Fib(n)= 1, n = 1 fib(n 1) + fib(n 2), altfel


Funcia corespunztoare este urmtoarea int fib(int n) { if(n==0 || n==1) return 1; else return fib(n-1)+fib(n-2); } Programul aferent este: #include<iostream.h> int n ; int fib(int n) { if(n==0 || n==1) return 1; else return fib(n-1)+fib(n-2); } void main(){ cout<<n= ; cin>>n; cout<<fib(n); } Ce se ntmpl dac n este relativ mare ( n=100) ? Dar foarte mare? Exemplu 3. Calculul funciei Manna-Pnueli pentru un x intreg.:

x 1, x. > = 12 F(x)= F ( F ( x + 2)), x < 12


Transpunem formula n funcia recursiv:

int manna(int x) { if(x>=12) return x-1; else return manna(manna(x+2)); } Mai jos este programul ce apeleaz aceast funcie: # include <iostream.h> int manna(int x) { if(x>=12) return x-1; else return manna(manna(x+2)); } void main() { int n; cout<<n=; cin >>n; cout<<mana(n); } Exemplu 4. S se calculeze recursiv suma cifrelor unui numr natural. Indicaie: Se izoleaz ultima cifr, iar lui n i se atribuie ctul ntreg dintre vechea valoare i 10. Astfel gsim o relaie de recuren, necesar elaborrii variantei recursive:

0, n = 0 S(n)= n%10 + S (n / 10), altfel


Avem programul: #include <iostream.h> int suma(long n){ if (n<10) return n; else return n%10+suma(n/10); } void main(){ int n; cout<<"n="; cin>>n; cout<<"suma cifrelor este "<<suma(n); }

Activitatea de nvare 2.1 Identificarea definiiei recursive corecte


Competena: Aplic principiile recursivitii i iterativitii n rezolvarea problemelor Obiectivul vizat: S fii capabil s identifici dac o definiie recursiv este corect sau nu. Durata: 10 minute

Tipul activitii : Gsete eroarea Sugestii Activitatea se poate face individual pe caiet, sau toat clasa folosind tabla. Sarcina de lucru Se dau urmtoarele definiii recursive: a) f: N N

0 daca x < 1 f(x)= f(x + 2) daca x par f(x) + 5 daca x impar


b) g: ZZ

1 daca x = 0 g(x)= g(x -1) + 5 altfel


c) h: NN

0 daca x < = 1 h(x)= h(x - 1) + 5 , altfel


Sunt corecte aceste definiii? Justific rspunsul.

Activitatea de nvare 2.2 Condiia de terminarare


Competena: Aplic principiile recursivitii i iterativitii n rezolvarea problemelor Obiectivul vizat: S fii capabil s gseti condiia de terminare ntr-un subprogram recursiv dat. S recunoti principiul recursivitii n programare i s dobndeti tehnica de realizare a recursivitii. Durata: 10 minute

Tipul activitii Completeaz spaiile Sugestii Activitatea se poate face individual, un elev la cte un calculator, pe grupe sau n perechi. Sarcina de lucru Completeaz spaiile libere din subprogramul recursiv prezentat mai jos cu o expresie corespunztoare, astfel nct n urma apelului f(12) s se afieze irul de valori: 12 6 3 1 1 3 6 12. void f(int i) { if ( ) { cout<<i<< ; f(12); cout<<i<< ;}}

Activitatea de nvare 2.3 Identificarea soluiei corecte


Competena: Aplic principiile recursivitii i iterativitii n rezolvarea problemelor Obiectivul vizat: S fii capabil s interpretezi tehnica recursiv aplicat ntr-o problem atunci cnd i se dau datele de intrare. S fii capabil s determini rezultatul unui subprogram recursiv. Durata: 10 minute

Tipul activitii: Problematizare Sugestii Activitatea se poate face individual, fiecare elev pe caiet, pe grupe sau n perechi. Se verific la tabl sau rulnd programul pe calculator Sarcina de lucru Se d urmtorul subprogram: void scrie (int x)

{ if (x>1) scrie (x-2); cout<<x%2; } Ce se afieaz pe ecran la apelul scrie(12)? a) 10101 b) 11111 c) 01010 d) 00000.

Activitatea de nvare 2.4 Aplicarea definiiei recursive


Competena: Aplic principiile recursivitii i iterativitii n rezolvarea problemelor Obiectivul vizat: S fii capabil s aplici tehnica recursiv la rezolvarea unei probleme atunci cnd i se d o definiie recursiv. S fii capabil s identifici situaiile n care poi aplica principiul recursivitii. Durata: 20 minute

Tipul activitii: Exerciiul practic Sugestii Activitatea se poate face individual, fiecare elev pe caiet, pe grupe sau n perechi Sarcina de lucru Se d funcia lui Ackermann, definit mai jos. Se citesc numerele m i n naturale. S se calculeze Ack(m,n).

n + 1, m = 0 Ack(m,n)= Ack ( m 1,1), n = 0 Ack (m 1, Ack (m, n 1)), altfel


Ce se ntmpl pentru valori mici ale lui m i n ? De exemplu, Ack(4,4). ncearc.

Fia de documentare 2.2 Algoritmi de traversare, inversare a unei structuri

Definiie Traversarea i inversarea unei structuri nseamn efectuarea unor operaii oarecare asupra tuturor elementelor unei structuri n ordine direct, respectiv n ordine invers. Variantele recursive sunt mai elegante i concise, dect alte metode. Se pot aplica structurilor de tip tablou, list, fiier i pot fi o soluie pentru diverse probleme (transformarea unui ntreg dintr-o baz n alta, etc). ntr-o form general, algoritmii se pot scrie: funcie traversare(tip_element element) { dac( element <> ultimul_din_structur) atunci traversare(element_urmtor) prelucrare(element); }

Apelul iniial al procedurii se face cu primul element al structurii. De observat importana ca parametrul formal al celor dou funcii s fie de tip valoare, pentru a nu fi alterat de apelul recursiv.

Exemplu 1: Se citesc i se afiseaz elementele ntregi ale unui vector. Cele dou funcii recursive, pentru citire i afiare pot ncepe cu ultimul element din vector i se termin cu primul. #include <iostream.h> int n,a[100]; void citeste(int i) {if (i!=n-1) citeste(i+1); cout<<i<< ; cin>>a[i];} void scrie(int i) {if (i!=n-1) scrie(i+1); cout<<a[i]<< ;}

void main() {cout<<n=; cin>>n; citeste(0); scrie(0);}

Activitatea de nvare 2.5 Existena unui element(1)


Competena: Aplic principiile recursivitii i iterativitii n rezolvarea problemelor Obiectivul vizat: S fii capabil s identifici situaiile n care poi aplica principiul recursivitii. S fii capabil s aplici tehnica recursiv pentru rezolvarea unei probleme date. S fii capabil s determini o variant de rezolvare. Durata: 20 minute

Tipul activitii: Harta traseu Sugestii Activitatea se poate face individual, pe caiet, pe grupe sau n perechi la laborator. Sarcina de lucru Se d un vector a=(a1,a2,...,an) cu n elemente ntregi, i un element cu valoarea ntreag x. Folosind funcia recursiv gasit(x,i) definit mai jos, s descrii n ordine logic etapele de rezolvare a verificrii existenei elementului x ntre componentele vectorului.

true, daca x = ai gasit(x,i)= false , daca x ai

Activitatea de nvare 2.6 Existena unui element(2)


Competena: Aplic principiile recursivitii i iterativitii n rezolvarea problemelor Obiectivul vizat: S fii capabil s aplici tehnica recursiv pentru rezolvarea unei probleme date. S fii capabil s determine o alt variant de rezolvare,cnd i se d una. S fii capabil s determini instruciunea de apel corect.

Durata: 20 minute
2 1 3 P

Tipul activitii: Transformare Sugestii

Activitatea se poate face individual, fiecare elev pe caiet, pe grupe sau n perechi. Sarcina de lucru S se verifice dac exist ntr-un vector cu n elemente ntregi, cel puin un element cu valoarea intreag x. Fie vectorul a=(a1,a2,...,an) i o variant de rezolvare. Varianta 1: #include <iostream.h> int a[100]; int gasit(int x, int i) {if(i = = 0) return x = = a[0]; else return ((x = = a[i]) || gasit(x,i-1));} void main() {int x,i,n; cout<<n= ; cin>>n; cout<<x= ; cin>>x; for(i=0;i<n;i++) {cout<<a[<<i<<]=; cin>>a[i];} if(gasit(x,n-1)) cout<<s-a gasit elementul<<x; else cout<<nu s-a gasit elementul<<x;}

Activitatea de nvare 2.7 Existena unui element(3)


Competena: Aplic principiile recursivitii i iterativitii n rezolvarea problemelor Obiectivul vizat: S fii capabil s determini o alta variant de rezolvare, cnd i se d una. S fii capabil s gsesti algoritmul optim.

Ce vreau? Durata: 20 minute Ce ? De ce vreau? vreau? Cum? Pot? vreau?

vreau?

Tipul activitii: Starbursting Sugestii Activitatea se poate face individual, fiecare elev pe caiet, pe grupe sau n perechi la teorie. Sarcina de lucru S se verifice dac exist ntr-un vector cu n elemente ntregi, cel puin un element cu valoarea intreag x. Fie vectorul a=(a1,a2,...,an) i o variant de rezolvare a problemei. S se optimizeze aceast variant de rezolvare rspunznd i la ntrebrile din colurile steluei. Varianta 3 : #include <iostream.h> int a[100]; int gasit(int x, int i) {if(i > n) return 0]; else if(x = = a[i]) return 1 ; else return gasit(x,i+1);} void main() {int x,i,n; cout<<n= ; cin>>n; cout<<x= ; cin>>x; for(i=1;i<=n;i++) {cout<<a[<<i<<]=; cin>>a[i];} if(gasit(x,1)) cout<<s-a gasit elementul<<x; else cout<<nu s-a gasit elementul<<x;}

Activitatea de nvare 2.8 Determinarea algoritmului pseudocod


Competena: Aplic principiile recursivitii i iterativitii n rezolvarea problemelor Obiectivul vizat: S fii capabil s determini datele de intrare. S fii capabil s determini datele de ieire. S fii capabil s determini schema de rezolvare a problemei soluionat de programul dat.

Durata: 5 minute
B A C

Tipul activitii: Reducere Sugestii Activitatea se poate face individual, fiecare elev pe caiet, pe grupe sau n perechi, la clas. Sarcina de lucru Se d programul de mai jos. Folosind limbajul pseudocod s se rescrie acest program. #include <iostream.h> int suma(int i, int j, int m, int a[20][20]) {if (i = = 0 && j = = 0) if (a[0][0]%2==0) return a[0][0]; else return 0; else if (a[i][j]%2==0) if (j==0) return a[i][j]+suma(i-1,m-1,m,a); else return a[i][j]+suma(i,j-1,m,a); else if(j==0) return suma(i-1,m-1,m,a); else return suma(i,j-1,m,a);} void citeste (int a[20][20], int &n, int &m) {int i,j; cout<<n=; cin>>n; cout<<m=;cin>>m for(i=0;i<n;i++) for(j=0;j<m;j++) {cout<<a(<<i+1<<,<<j+1<<)= ;cin>>a[i][j];}} void main() {int n,m,a[20][20]; citeste(a,n,m); cout<<suma este<<suma(n-1,m-1,m,a)<<endl;}

Fia de documentare 2.3 Tipuri de algoritmi de divizare

Definiie Tehnica divizrii ("divide and conquer" sau divide et impera), este fundamental n elaborarea algoritmilor i const n descompunerea unei probleme complexe n mai multe subprobleme a cror rezolvare e mai simpl i din soluiile crora se poate determina soluia problemei iniiale (exemple: gsirea minimului i maximului valorilor elementelor unui tablou, cutarea binar, sortare Quicksort, turnurile din Hanoi). Un algoritm de divizare general se elaboreaz astfel: la un anumit nivel avem dou posibiliti: 1. s-a ajuns la o problem care admite o rezolvare imediat (condiia de terminare), caz n care se rezolv i se revine din apel; 2. nu s-a ajuns n situaia de la punctul 1, caz n care problema curent este descompus n (dou sau mai multe) subprobleme, pentru fiecare din ele urmeaz un apel recursiv al funciei, dup care combinarea rezultatelor are loc fie pentru fiecare subproblem, fie la final, naintea revenirii din apel.

Exemplul 1. Se citete un vector cu n componente numere naturale. S se tipreasc valoarea maxim din vector. Problema se rezolv eficient cu metodele cunoscute , dar poate fi folosit ca un exemplu i pentru tehnica recursiv.

Se procedeaz astfel: dac(i==j) maxim va fi v[i]; altfel se mparte vectorul n doi vectori , primul cu componente de la i la (i+j)/2 ; al doilea cu componente de la (i+j)/2+1 pna la j; se rezolv subproblemele, iar soluia va fi dat de maximul dintre cele dou subprobleme.

#include <iostream.h> int v[10],n; int max(int i, int j) { int a, b; if (i==j) return v[i]; else { a=max(i,(i+j)/2); b=max((i+j)/2+1,j); if(a>b)return a; else return b;}} void main() {cout<<n=; cin>>n; for(int i=1;i<=n;i++) {cout<<v[<<i<<]=; cin>>v[i];} cout<<max=<<max(1,n); }

Activitatea de nvare 2.9 Cutare binar


Competena: Aplic principiile recursivitii i iterativitii n rezolvarea problemelor Obiectivul vizat: S fii capabil s determini ordinea de execuie corect a instruciunilor unui program. S fii capabil s-i nsueti logica programului. S fii capabil s determini ordinea corect a instruciunilor programului.

Durata: 15 minute Tipul activitii: Reconstrucie Sugestii Activitatea se poate face individual, fiecare elev pe caiet sau pe grupe. Sarcina de lucru Se dau instruciunile de mai jos reprezentnd algoritmul cutarii binare ( care se refer la urmtoarea problem: se citete un vector cu n componente numere ntregi, unde numerele se presupun ordonate cresctor i o valoare intreag nr. S se decid dac nr se gsete sau nu printre numerele citite, iar n caz afirmativ s se tipreasc indicele componentei care conine acea valoare.). Instruciunile nu sunt in ordinea corect de execuie. Aranjeaz aceste instruciuni pentru a obine varianta corect a programului. Indicaie: Problema este de a decide dac valoarea cutat se gsete printre numerele de indice cuprins ntre i i j (iniial i=1 , j=n). Procedm astfel: dac nr coincide cu valoarea de indice (i+j)/2 ( mijloc ) se tiprete indicele i se revine din apel; contrar, dac i<j (nu s-a cutat peste tot) problema se descompune astfel: Dac numrul este mai mic dect valoarea testat (din mijloc), inseamn c avem anse s-l gsim ntre componentele cu indicele cuprins ntre i i (i+j)/2-1, caz in care reapelam funcia cu aceti parametri. Dac numrul este mai mare dect valoarea testat (din mijloc), inseamn c avem anse s-l gsim ntre componentele cu indicele cuprins ntre (i+j)/2+1 i j, caz n care reapelm funcia cu aceti parametri. #include <iostream.h> cin>>n; {cout<<n=; if (nr<v[(i+j)/2]) caut(1,n);} void main() cin>>nr; for(int i=1;i<=n;i++) cout<<gasit<< <<indice <<(i+j)/2; cout<<nr=; else caut ((i+j)/2+1,j);}} else if(i<j) void caut(int i,int j) {cout<<v[<<i<<]; int v[100],n,nr; {if (nr==v[(i+j)/2]) caut (i,(i+j)/2-1); cin>>v[i];}

Fia de documentare 2.4 Tipuri de algoritmi recursivi cu revenire


Definiie Algoritmii cu revenire (algoritmi de tip backtracking) se aplic problemelor n care soluia se poate reprezenta sub forma unui vector x=(x1,x2,...xn) cu S=S1 x S2 x...x Sn, unde mulimile Si sunt finite, S numindu-se spaiul soluiilor posibile. n particular, Si sunt identice avnd acelai numr M de elemente. Pentru fiecare problem concret sunt date anumite relaii ntre componentele vectorului x, numite condiii interne. Determinarea tuturor soluiilor rezultat se poate face genernd toate soluiile posibile i verificnd apoi dac satisfac condiiile interne. Dar timpul de calcul ar fi foarte mare (dac mulimile Si ar avea numai cte 2 elemente, timpul ar fi proporional cu 2 n). Elementele vectorului x primesc valori pe rnd, lui xi i se atribuie valori, doar dac x1,x2,...,xi-1 au primit deja valori, valorile atribuite trebuind s verifice condiiile de continuitate referitoare la x1,x2,...,xi. Doar apoi se trece la calculul lui xi+1. n cazul nendeplinirii condiiilor de continuitate, se alege urmtoarea valoare posibil pentru xi. Dac Si a fost epuizat, se micoreaz i, ncercnd o alt alegere pentru xi-1. Pe acest metod se bazeaz rezolvarea unor probleme clasice ca: permutri de n, "opt regine", partiii, "relaii stabile", colorarea unei hrti, tierea unui fir de lungime l n pri de lungimi date, etc. Se consider rutina general recursiv back cu un parametru p, care reprezint nivelul stivei, Contorul i al ciclului for ia pe rnd toate valorile posibile fiecrui nivel. Se obine soluie cnd stiva este complet.

void back(int p) {int i; for(i=1;i<=n;i++) {st[p]=i; if valid(p) if(p==n) tipar (p) else back(p+1); } }

Activitatea de nvare 2.10 Permutari


Competena: Aplic principiile recursivitii i iterativitii n rezolvarea problemelor Obiectivul vizat: S fii capabil s execui pas cu pas algoritmul de afiare a permutrilor de n. S fii capabil s-i nsueti tehnica rutinei recursive a programului. S fii capabil s enuni o situaie real in care se poate aplica acest algoritm.

Durata: 15 minute

Tipul activitii: Urmeaz paii Sugestii Activitatea se poate face individual sau pe grupe. Sarcina de lucru S se calculeze recursiv permutri de n, n natural citit de la tastatur. Gsete o problem din viaa real la care se poate aplica acest algoritm. #include <iostream.h> int t[20],n; void tipar() {for(int i=1;i<=n;i++) cout<<t[i]; cout<<endl;} void perm(int k) {int i,j,corect;

if (k==n+1) tipar(); else {for(i=t[k]+1;i<=n;i++) { t[k]=i; corect=1; for(j=1;j<=k-1;j++) if(t[j]==t[k] ) corect=0; if (corect) perm(k+1);}} t[k]=0;} void main() {cout<<n=; cin>>n; perm(1);}

Activitatea de nvare 2.11 Dame


Competena: Aplic principiile recursivitii i iterativitii n rezolvarea problemelor Obiectivul vizat: S fii capabil s modifici algoritmul generrii permutrilor astfel inct s rezolvi problema aezrii damelor. S fii capabil s descoperi care este condiia ca dou dame s nu se atace pe o tabl de ah. S fii capabil s aplici funcionarea acestui algoritm pentru un caz particular dat.

Durata: 15 minute

Tipul activitii: Problematizare Sugestii Activitatea se poate face individual sau pe grupe la teorie sau laborator. Sarcina de lucru Se dau n dame pe o tabl de ah de dimensiune n*n. S se afieze toate soluiile posibile de aranjare a celor n dame pe tabl astfel nct s nu se atace. Exemplificare pentru n=4 Indicaie Metoda de rezolvare seaman cu rezolvarea permutrilor pe care o avei mai jos, doar c n condiia de validare se adaug condiia ca damele s nu se

atace( dou dame se atac dac se afl pe aceeai linie sau pe aceeai coloan sau pe aceeai diagonal) Se va modifica i funcia de tiprire. #include <iostream.h> int t[20],n; void tipar() {for(int i=1;i<=n;i++) cout<<t[i]; cout<<endl;} void perm(int k) {int i,j,corect; if (k==n+1) tipar(); else {for(i=t[k]+1;i<=n;i++) { t[k]=i; corect=1; for(j=1;j<=k-1;j++) if(t[j]==t[k] ) corect=0; if (corect) perm(k+1);}} t[k]=0;} void main() {cout<<n=; cin>>n; perm(1);}

Activitatea de nvare 2.12 Partiii


Competena: Aplic principiile recursivitii i iterativitii n rezolvarea problemelor Obiectivul vizat: S fii capabil s deduci modul de funcionare a funciei recursive din program care calculeaz partiia numrului dat. S fii capabil s nelegi necesitatea celor doi parametri din funcia recursiv i semnificaia lor. S fii capabil s observi de ce ajungem cu siguran la soluie. S fii capabil s determini ce face programul pentru o dat de intrare specificat.

Durata: 15 minute

Tipul activitii: Observare sistematic i independent

Sugestii Activitatea se poate face individual sau pe grupe la clas. Sarcina de lucru Se d programul de mai jos, care citete n natural i tiprete toate modurile de descompunere a lui ca sum de numere naturale. Care este modul de funcionare a funciei recursive din program care calculeaz partiia numrului dat, care este semnificaia celor doi parametri din aceast funcie i de ce se ajunge sigur la soluie? Pentru n=4 ce se afieaz? #include <iostream.h> int s[20],n; void tipar(int k) {for(int i=1;i<=k;i++) cout<<s[i]; cout<<endl;} void part(int k, int v) {int i; s[k]=v; tipar(k); for(i=1;i<=s[k]-1;i++) {s[k]=s[k]-i; part(k+1,i); s[k]=s[k]+i;}} void main() {cout<<n=; cin>>n; part(1,n);}

Fia de documentare 2.5 Algoritmi iterativi i recursivi

Axioma S-a demonstrat matematic c orice algoritm recursiv poate fi scris iterativ, i reciproc .

Activitatea de nvare 2.13 Metode iterative i recursive


Competena: Aplic principiile recursivitii i iterativitii n rezolvarea problemelor Obiectivul vizat: S fii capabil s gseti legtura ntre prile precizate. S fii capabil s recunoti definiiile specificate.

Durata: 15 minute

Tipul activitii: mperechere Sugestii Activitatea se poate face individual, un elev la cte un calculator, folosind fia de lucru. Activitatea se poate face i pe grupe sau n perechi. Sarcina de lucru Se dau urmtoarele tipuri de informaii: 1.iteraie, 2.recursiv, 3.metod, 4. subprogram, 5. programare. S se mperecheze corespunztor cu urmtoarele enunuri: a. parte a unui program. b. ansamblu de mijloace socotite proprii pentru realizarea unui scop; mod de executare a unui lucru. c. care poate fi repetat n mod nelimitat. d. repetare a unui anumit procedeu de calcul prin aplicarea lui la rezultatul calculului din etapa precedent. e. operaia de elaborare a programului n vederea rezolvrii unei probleme cu calculatorul electronic.

Activitatea de nvare 2.14 Tratare comparativ


Competena: Aplic principiile recursivitii i iterativitii n rezolvarea problemelor Obiectivul vizat: S fii capabil s transformi o definiie recursiv intr-un algoritm iterativ.

S fii capabil s gseti asemnri ntre metoda iterativ i recursiv. S fii capabil s gseti diferene ntre metodele iterativ i recursiv.

Durata: 15 minute

Tipul activitii: Asemnri i diferene Sugestii Activitatea se poate face individual sau pe grupe, la teorie, respectiv laborator. Sarcina de lucru S se studieze cele dou metode de rezolvare, iterativ i recursiv, fcndu-se o tratare comparativ a lor pentru algoritmul lui Euclid:

a, a = b Cmmdc(a,b)= cmmdc(a b, b), a > b cmmdc(a, b a), a < b

Tema 3. Avantajele i dezavantajele recursivitii


Fia de documentare 3.1 Eliminarea recursivitii

Avantaje De multe ori, soluia unei probleme poate fi elaborat mult mai uor, mai clar i mai simplu de verificat, printr-un algoritm recursiv. Dezavantaje Varianta recursiv poate duce la timp de execuie i spaiu de memorie prea mari, transformarea n una nerecursiv, eliminnd aceste dezavantaje. Se va utiliza una din metodele de eliminare a recursivitii ce folosete o structur de date de tip stiv. n scrierea unei variante nerecursive, trebuie parcuri toi paii implicai n varianta recursiv, prin tehnici nerecursive. Din aplicaiile prezentate n fiele 2.1 i 2.5 se observ diferenele dintre cele dou metode de rezolvare astfel: Avantajul recursivitii const n faptul c soluile recursive sunt mult mai clare , mai scurte i mai uor de urmrit, deci mult mai elegante. Ele sunt mult mai avantajoase dect cele iterative dac: Soluiile problemei sunt definite recursiv; Cerinele problemei sunt formulate recursiv; n unele cazuri este foarte greu de definit o soluie iterativ , cum este cazul algoritmilor n care o funcie recursiv apeleaz o alt funcie recursiv care depinde de prima funcie (recursivitate indirect) i atunci n mod obligatoriu este preferabil algoritmul recursiv.

Activitatea de nvare 3.1 irul lui Fibonacci


Competena: Aplic principiile recursivitii i iterativitii n rezolvarea problemelor Obiectivul vizat: S fii capabil s enumeri dezavantajul folosirii recursivitii n acest caz. S fii capabil s gseti varianta ce elimin dezavantajele metodei recursive.

Durata: 30 minute

Tipul activitii: Cubul Sugestii Activitatea se face pe 6 grupe la clas, sau individual. Sarcina de lucru Problem nostim: Cte perechi de iepuri se pot obine n n luni dintr-o singur pereche tiind c: - la momentul iniial, iepurii din prima pereche sunt nou-nscui; - fiecare nou pereche de iepuri devine fertil dup o lun; - fiecare pereche produce o pereche de descendeni n fiecare lun; - nici un iepure nu moare. Numrul perechilor de iepuri din fiecare lun este descris de irul: Luna 0 1 2 3 4 5 6 7 Nr. perechi 1 1 2 3 5 8 1 2 Fiecare grup va rezolva cerina fiecrei fee. Faa 1: ce tip de problem este? Faa 2: scrie formula ce rezolv problema. Faa 3: ce variante avem pentru rezolvare? Faa 4: scrie varianta cea mai avantajoas. Faa 5: argumenteaz alegerea variantei. Faa 6: enumer un dezavantaj al variantei neutilizate. 8 3 .

Activitatea de nvare 3.2 Recursivitate indirect


Competena: Aplic principiile recursivitii i iterativitii n rezolvarea problemelor Obiectivul vizat: S fii capabil s elaborezi programul ce rezolv cerina problemei date. S fii capabil s enumeri necesitatea folosirii recursivitii n acest caz. Durata: 45 minute

Tipul activitii: Problematizare Sugestii Activitatea se poate face individual, n perechi sau pe grupe la laborator.

Sarcina de lucru Se consider irurile definite recurent astel: a0=a; b0=b; a,b>0: a + bn 1 a n = n 1 , bn = a n 1bn 1 2 S se scrie un program care s citeasc a,b i n i s se calculeze an i bn.(Dac dou iruri sau mai multe se apeleaz reciproc avem recursivitate indirect sau ncruciat.)

Tema 4. Tehnica de programare Divide et Impera


Fia de documentare 4.1 Descriere general
Divide et impera este o tehnic special prin care se pot rezolva anumite probleme.

Tehnica Divide et Impera const n dou mari etape: Divide. Problema dat este mprit n dou sau mai multe subprobleme de acelai tip, dar de dimensiuni mai mici. Subproblemele se rezolv direct, dac dimensiunea lor permite aceasta (cazuri elementare), sau, fiind de acelai tip, se rezolv n mod recursiv, prin acelai procedeu. Impera. Se combin soluiile subproblemelor pentru a obine soluia problemei iniiale.

Restricii Tehnica Divide et Impera se poate aplica n rezolvarea unei probleme care ndeplinete urmtoarele condiii : - se poate descompune n ( dou sau mai multe) subprobleme ; - aceste subprobleme sunt independente una fa de alta (o subproblem nu se rezolv pe baza alteia i nu se folosete de rezultatele celeilalte); - aceste subprobleme sunt similare cu problema iniial; - la rndul lor subproblemele se pot descompune (dac este necesar) n alte subprobleme mai simple; - aceste subprobleme simple se pot soluiona imediat prin algoritmul simplificat. Numrul problemelor care se rezolv prin aceast metod este relativ mic, tocmai datorit restriciilor de mai sus.

Pentru a intui funcionarea algoritmului lum ca exemplu un turneu de tenis. Participanii sunt mprii n dou grupe, se organizeaz turneul n cadrul fiecrei grupe, iar finala se va disputa ntre cei doi ctigtori ai turneului pe grupe. Ctigtorul finalei este ctigtorul ntregului turneu. Organizarea turneului pe grupe se face dup acelai procedeu: se mpart concurenii din cadrul grupei pe semigrupe, se organizeaz turneul pe semigrupe, iar ctigtorul grupei se decide ntr-un meci de semifinal ntre cei doi ctigtori din cele dou semigrupe .a.m.d. mprirea se repet pn cnd avem doar doi juctori, care joac un meci direct. Schema general Tehnica Divide et Impera admite o implementare recursiv, deoarece subproblemele sunt similare problemei iniiale, dar de dimensiuni mai mici. Principiul fundamental al recursivitii este autoapelarea unui subprogram cnd acesta este activ; ceea ce se intampl la un nivel, se intampl la orice nivel, avnd grij s

asigurm condiia de terminare a apelurilor repetate. Asemntor se intmpl i n cazul tehnicii Divite et Impera ; la un anumit nivel sunt doua posibiliti: s-a ajuns la o (sub)problem simpl ce admite o rezolvare imediat, caz n care se rezolv (sub)problema i se revine din apel (la subproblema anterioar, de dimensiuni mai mari); s-a ajuns la o (sub)problem care nu admite o rezolvare imediat, caz n care o descompunem n dou sau mai multe subprobleme i pentru fiecare din ele se continu apelurile recursive (ale funciei). n etapa final a tehnicii Divide et Impera se produce combinarea subproblemelor (rezolvate deja) prin secvenele de revenire din apelurile recursive. Etapele tehnicii Divide et Impera sunt: Identificarea dimensiunii subproblemelor n general un subprogram Divide et Impera se aplic unui tablou (vector) V = <v 1,...,vn> (V[1..n], n=dim[V]), asupra cruia vrem s aplicm o operaie oarecare (sortare, determinarea valorii maxime, determinarea cmmdc, etc). Identificarea modalitii de mprire n subprobleme n acest caz se execut mprirea n dou subprobleme de dimensiuni aproximativ egale i anume [n/2] . mprirea n subprobleme are loc pn cnd dimensiunea acestora devine suficient de mic pentru a fi rezolvate n mod direct (cazul de baz). Rezolvarea subproblemelor Se rezolv subproblema direct. Combinarea soluiilor Dup rezolvarea celor dou subprobleme se execut faza de combinare a rezultatelor n vederea rezolvrii ntregii probleme. Se face prin interclasarea soluiilor. Subprogramul divide Subprogram DivImp(V,p,q) Daca q-p <= 1 atunci Rezolva(V,p,q) altfel m=(p+q) div 2 DivImp(V,p,m) DivImp(V,m+1,q) Combina(V,p,m,q) Sf_Daca Sf_subprogram. Apelul subprogramului Iniial p=1, q=n, rezult DivImp(V,1,n).

Activitatea de nvare 4.1 Divide et Impera

Competena: Utilizeaz tehnicile de programare Obiectivul vizat: S fii capabil s precizezi etapele tehnicii Divide et Impera. S fii capabil s explici rolul funcional al fiecrei etape. Durata: 15 minute

Tipul activitii: Diagrama pianjen Sugestii Activitatea se poate face individual sau pe grupe mici ( 2 3 elevi ), la clas. Sarcina de lucru Realizai o modalitate de a organiza informaiile necesare tehnicii Divide et Impera, inndu-se cont de rolul lor n cadrul ei.

Fia de documentare 4.2 Aplicaii practice


Exemplu : Maximul dintr-un vector Se citete un vector cu n componente, numere naturale. Se cere s se tipreasc valoarea maxim din ir. Trebuie tiparit valoarea maxim dintre numerele reinute n vector de la i la j (iniial i= 1, j=n). Pentru aceasta procedm astfel : daca i=j, valoarea maxim va fi v[i] ; contrar vom mpri vectorul n doi vectori (primul vector va conine componentele de la i la (i+j) div 2, al doilea va conine componentele de la ((i+j) div 2 +1 la j ) , rezolvm subproblemele (aflm maximul pentru fiecare din ele) iar soluia problemei va fi dat de valoarea maxim dintre rezultatele celor dou subprobleme. #include<iostream.h> int v[10],n; int max(int i ,int j) { int a,b; if (i==j) return v[i] ; else { a=max(i, (i+j)/2); b=max((i+j)/2+1,j); if (a>b) return a; else return b; } } main( ) { cout<<n=;cin>>n; for (int i=1;i<=n;i++) {cout<<v[<<i<<]=;cin>>v[i]; } cout<<max=<<max(1,n); }

Activitatea de nvare 4.2 Maximul dintr-un ir


Competena: Utilizeaz tehnicile de programare Obiectivul vizat: S fii capabil s descrii pas cu pas algoritmul din fia de documentare 4.2. S nelegi algoritmul ce descrie tehnica Divide et Impera. Durata: 15 minute

Tipul activitii: Urmeaz paii

Sugestii : Elevii se pot organiza n grupe mici ( 2-3 elevi) sau pot lucra individual Sarcina de lucru Urmnd exemplul din fia de documentare 4.2 s se descrie pas cu pas algoritmul prezentat pentru irul 89, 10, 11, 23, -1, 78, 4. Care este numrul de comparri?

Activitatea de nvare 4.3 Cutare binar


Competena: Utilizeaz tehnicile de programare Obiectivul vizat: S fii capabil s compari timpul de obinere a rezultatului cu tehnica Divide et Impera fa de alte metode. S nelegi i nsueti algoritmul prezentat.

Durata: 45 minute

Tipul activitii: Expansiune Sugestii: Elevii vor lucra individual fiecare la un calculator Sarcina de lucru: Se citete un vector cu n componente numere ntregi, ordonate cresctor i o valoare ntreag - nr. S se decid dac nr se gsete sau nu printre numerele citite, iar n caz afirmativ s se tipreasc indicele componentei care conine acea valoare (Cutare binar). Problema este de a decide dac valoarea cutat se gseste printre numerele de indice cuprins ntre i i j (iniial i=1, j=n ). Pentru aceasta vom proceda astfel: dac valoarea nr coincide cu valoarea de indice (i+j)/2 ( valoarea de la mijloc ) , se tiprete indicele i se revine din apel (problema a fost rezolvat). Contrar, dac i<j (nu s-a cutat peste tot) problema se descompune astfel: - dac numul este mai mic dect valoarea testat (din mijloc), nseamn c avem anse s-l gsim ntre componentele cu indicele ntre i i (i+j)/2-1 caz n care reapelm funcia cu aceti parametri.

dac numrul este mai mare dect valoarea testat (din mijloc), nseamn c avem anse s-l gsim ntre componentele cu indicele ntre (i + j)/2+1 i j , caz n care reapelm funcia cu aceti parametri. Problema nu se descompune n altele care se rezolv, dup care nu se compar soluia, ci se reduce la o subproblem. n linii mari , acest raionament este de tip Divide et Impera. -

Activitatea de nvare 4.4 Sortarea prin interclasare


Competena: Utilizeaz tehnicile de programare Obiectivul vizat: S nelegi i nsueti algoritmul prezentat. S fii capabil s determini numrul maxim de comparaii. Durata: 45 minute

Tipul activitii: Observare sistematic i independent Sugestii: Elevii vor lucra individual fiecare la un calculator Sarcina de lucru: Se consider vectorul a cu n componente numere ntregi ( sau reale ). S se sorteze cresctor, utiliznd sortarea prin interclasare. Care este numrul maxim de comparaii? Algoritmul de sortare prin interclasare se bazeaz pe urmtoarea idee: pentru a sorta un vector cu n elemente l mpim n doi vectori care, odat sortai, se interclaseaz. Conform strategiei Divide et Impera, problema este descompus n alte dou subprobleme de acelai tip i, dup rezolvarea lor, rezultatele se combin (n particular se interclaseaz). Descompunerea unui vector n ali doi vectori care urmeaz a fi sortai are loc pn cnd avem de sortat vectori de una sau dou componente. n aplicaie, funcia sort sorteaz un vector cu maximum dou elemente; funcia interc interclaseaz rezultatele; divimp implementeaz strategia general a tehnicii studiate. #include<iostream.h> int a[10],n; void sort (int p,int q, int a[10] ) { int m; if (a[p]>a[q]) { m=a[p];

a[p]=a[q]; a[q]=m;} } void interc (int p,int q, int m, int a[10]) { int b[10],i,j,k; i=p; j=m+1; k+1; while ((i<m) && (j<=q)) if (a[i]<=b[j] c[k]=a[i++] else c[k++]=b[j++] if (i<=m) for (j=1;j<=m;j++) c[k++]=a[j] else for (i=j;i<=q;i++) c[k++]=b[i] void divimp (int p, int q, int a[10]) { int m; if ((q-p)<=1) sort (p,q,a); else { m=(p+q)/2; divimp(p,m,a); divimp(m+1,q,a); interc(p,q,m,a); } } void main ( ) { int i ; cout<<n=;cin>>n; for (i=1;i<=n;i++) { cout<<a[<<i<<]=;cin>>a[i];} divimp(1,n,a); for (i=1;i<=n;i++) cout<<a[i]<< ; }

Activitatea de nvare 4.5 Turnurile din Hanoi


Competena: Utilizeaz tehnicile de programare Obiectivul vizat: S fii capabil s determini o formul recursiv pentru problema dat. S exemplifici pentru un n dat, ordinea mutrilor. S fii capabil s scrii programul corespunztor. Durata: 35 minute

Tipul activitii: Problematizare Sugestii: Elevii vor lucra individual fiecare la un calculator sau pe grupe la laborator. Sarcina de lucru: Se dau 3 tije simbolizate prin a,b,c. Pe tija a se gsesc n discuri de diametre diferite, aezate n ordine descresctoare a diametrelor privite de jos n sus. Se cere s se mute de pe tija a pe b, utiliznd ca tij intermediar tija c, respectnd urmtoarele reguli: la fiecare pas se mut un singur disc ; nu este permis s se aeze un disc cu diametrul mai mare peste un disc cu diametrul mai mic. Se observ c n cazul n care n>2, problema se complic. Notm cu H(n,a,b,c) irul mutrilor celor n discuri de pe tija a pe tija b , utiliznd ca tij intermediar, tija c. Conform strategiei Divide et Impera ncercm s descompunem problema n alte dou subprobleme de acelai tip, urmnd apoi combinarea soluiilor. n acest sens, observm c mutarea celor n discuri de pe tija a pe tija b, utiliznd ca tij intermediar tija c, este echivalent cu: mutarea a n-1 discuri de pe tija a pe tija c , utiliznd ca tij intermediar tija b; mutarea discului rmas pe tija b; mutarea a n-1 discuri de pe tija c pe tija b , utiliznd ca tij intermediar tija a.

Tema 5. Tehnica de programare Backtracking


Fia de documentare 5.1 Descrierea tehnicii standard (iterativ)

Aceast tehnic se folosete n rezolvarea problemelor care ndeplinesc simultan urmtoarele condiii: - soluia lor poate fi pus sub forma unui vector S=x 1,x2, ...,xn, cu x1 A1, x2 A2 ,...,xn An; - mulimile A1, A2 , ., An sunt mulimi finite, iar elementele lor se consider c se afl ntr-o relaie de ordine bine stabilit; - nu se dispune de o alt metod de rezolvare, mai rapid; - x1 x2 , xn pot fi la rndul lor vectori; - A1, A2 , An pot coincide. Tehnica Backtracking are la baz un principiu extrem de simplu: - se construiete soluia pas cu pas: x1, x2 ,xn - dac se constat c, pentru o valoare aleas, nu avem cum s ajungem la soluie, se renun la acea valoare i se reia cutarea din punctul n care am rmas. Concret: - se alege primul element x1, ce aparine lui A1; - presupunnd generate elementele x1,x2 ,xk , aparinnd mulimilor A1, A2 ,Ak , se alege (dac exist) xk+1 , primul element disponibil din mulimea A k+1. Apar dou posibiliti : 1) Nu s-a gsit un astfel de element, caz n care se reia cutarea considernd generate elementele x1,x2 ,xk+1 , iar aceasta se reia de la urmtorul element al mulimii Ak rmas netestat; 2) A fost gsit, caz n care se testeaz dac acesta ndeplinete anumite condiii de continuare aprnd astfel dou posibiliti: - ndeplinete, caz n care se testeaz dac s-a ajuns la soluie i apar din nou dou posibiliti: - s-a ajuns la soluie, se tiprete soluia i se reia algoritmul considernd generate elementele x1,x2 ,xk , (se caut n continuare, un alt element al mulimii A k , rmas netestat); - nu s-a ajuns la soluie, caz n care se reia algoritmul considernd generate elementele x1,x2 ,xk , i se caut un prim element xk+2 Ak. - nu le ndeplinete, caz n care se reia algoritmul considernd generate elementele x1,x2 ,xk , iar elementul xk-1 se caut ntre elementele mulimii A, rmase netestate. Algoritmul se termin atunci cnd nu exist nici un element x 1 A1 netestat. Observaie: tehnica Backtracking are ca rezultat obinerea tuturor soluiilor problemei. n cazul n care se cere o sigur soluie se poate fora oprirea, atunci cnd aceasta a fost gsit. Am artat c orice soluie se genereaz sub form de vector. Vom considera c generarea soluiilor se face intr-o stiv. Astfel, x 1 A1, se va gsi pe primul nivel al stivei, x2 A2 se va gsi pe al doilea nivel al stivei,..., x k Ak se va gsi pe nivelul k al stivei. n acest fel, stiva (notat ST) va arta astfel:

xk

ST

Nivelul k+1 al stivei trebuie x2 iniializat (pentru a alege, n ordine, elementele mulimii k+1 ). Iniializarea trebuie fcut cu o valoare aflat (n relaia de ordine x considerat, pentru mulimea A k+1 ) naintea 1 tuturor valorilor posibile din mulime. De exemplu, pentru generarea permutrilor mulimii {1,2.....n}, orice nivel al stivei va lua valori de la 1 la n. Iniializarea unui nivel (oarecare) se face cu valoarea 0. Funcia de iniializare o vom numi init(). Gsirea urmtorului element al mulimii Ak (element care a fost netestat) se face cu ajutorul funciei am_succesor(). Variabila as este o variabil boolean. n situaia n care am gsit elementul, acesta este pus n stiv i as ia valoarea TRUE, contrar (nu a rmas un element netestat) as ia valoarea FALSE. Odat ales un element, trebuie vzut dac acesta ndeplinete condiiile de continuare (altfel spus, dac elementul este valid). Acest test se face cu ajutorul funciei e_valid(). Testul dac s-a ajuns sau nu la soluia final se face cu ajutorul funciei solutie(), iar o soluie se tiprete cu ajutorul funciei tipar(). Prezentm n continuare rutina back(): void back () { int as; k=1; init(); while (k>0) { do {} while ((as=am_succesor()) && !e_valid()); if (as) if (solutie()) tipar(); else {k++; init();} else k--; } }

Activitatea de nvare 5.1 Rutina de backtracking


Competena: Utilizeaz tehnicile de programare Obiectivul vizat: S fii capabil s precizezi funciile subrutinei back. S fii capabil s explici rolul fiecrei funcii din subrutina back. Durata: 15 minute

Tipul activitii: Harta tip traseu Sugestii: Elevii vor lucra individual sau pe grupe la teorie. Sarcina de lucru: S realizezi o hart tip traseu pornind de la tehnica Backtracking n care s se regseasc toate funciile componente rutinei back, innd cont de rolul avut de acestea n cadrul metodei.

Activitatea de nvare 5.2 Problema damelor


Competena: Utilizeaz tehnicile de programare Obiectivul vizat: S fii capabil s identifici ce reprezint ce pui pe stiv i ce reprezint nivelul stivei pentru problema dat. S fii capabil s scrii coninutul funciilor ce apar n rutina back, relativ la problema damelor. Durata: 20 minute

Tipul activitii: Rezumare Sugestii: Elevii vor lucra individual fiecare la un calculator sau pe grupe la laborator. Sarcina de lucru: Fiind dat o tabl de ah, de dimensiune n x n, se cere s se scrie coninutul funciilor standard din rutina back ce genereaz toate soluiile de aranjare a n dame, astfel nct s nu se afle dou dame pe aceeai linie, coloan sau diagonal (damele s nu se atace ). Precizai ce punem pe stiv i ce reprezint nivelul stivei n acest caz, precum i funciile programului.

Fia de documentare 5.2 Aplicaii practice

Se exemplific mai nti problemele de baz, din care, prin mici modificri, se obin probleme mai complexe. Se folosete metoda Backtracking standard ( cu funciile prezentate n fia 5.1 de la tema 5).

Activitatea de nvare 5.3 Generarea permutrilor


Competena: Utilizeaz tehnicile de programare Obiectivul vizat: S nelegi algoritmul prezentat. S fii capabil s exemplifici pe algoritm pentru o valoare mic dat lui n. S fii capabil s identifici condiia de oprire a algoritmului Durata: 25 minute

Tipul activitii: Studiul de caz Sugestii: Elevii vor lucra individual fiecare la un calculator sau pe grupe la laborator. Sarcina de lucru: Se citete un numr natural n. S se genereze toate permutrile mulimii {1,2,,n}. Generarea permutrilor se face innd cont c orice permutare va fii alctuit din elemente distincte ale mulimii A={1,2,..,n}. Exemplific pentru n=3 pe programul de mai jos. Pn cnd se continu algoritmul? #include<iostream.h> int st[10],n,k; void init() { st[k]=0;} int am_succesor() { if (st[k]<n) { st[k]++; return 1;} else return 0;} int e_valid() { for(int i=1;i<k;i++) if (st[i]==st[k]) return 0; return 1;} int solutie() { return k==n;}

void tipar() { for(int i=1;i<=n;i++) cout<<st[i]; cout<<endl;} void back() { int as; k=1;init(); while(k>0) { do{} while((as=am_succesor()) && !e_valid()); if(as) if(solutie()) tipar(); else { k++; init();} else k--; }} main() { cout<<"n="; cin>>n; back(); }

Activitatea de nvare 5.4 Generarea aranjamentelor


Competena: Utilizeaz tehnicile de programare Obiectivul vizat: S fii capabil s determini asemnri i deosebiri ntre algoritmul de generare a permutrilor i cel al aranjamentelor. S fii capabil s modifici un program pentru a rezolva un alt tip de problem asemntor. Durata: 15 minute
2 1 3 P

Tipul activitii: Transformare

Sugestii: Elevii vor lucra individual fiecare la un calculator sau pe grupe la laborator. Sarcina de lucru: Se citesc n i p. S se genereze toate aranjamentele de n luate cte p. Care sunt asemnarile i deosebirile cu generarea permutrilor?

Activitatea de nvare 5.5 Generarea combinrilor


Competena: Utilizeaz tehnicile de programare Obiectivul vizat:

S fii capabil s scrii corect un program cu tehnica Backtracking standard. S fii capabil s gseti un algoritm cu care se aseamn. Durata: 25 minute

Tipul activitii: Problematizare Sugestii: Elevii vor lucra individual fiecare la un calculator sau pe grupe la laborator. Sarcina de lucru: Se citesc n i p numere naturale, n p. Se cere s se genereze toate submulimile cu p elemente ale mulimii {1,2,...,n}. Pentru rezolvarea problemei trebuie inut cont de urmtoarele: Stiva are inalimea p Elementele aflate pe niveluri diferite ale stivei trebuie s fie distincte. Pentru a evita repetiia, elementele se aeaz n ordine cresctoare: pe nivelul k, se va afla o valoare mai mare decat pe nivelul k-1 i mai mic sau egal cu n-p+k. Felicitri dac ai observant c nu are rost s apelezi e_valid ().

Activitatea de nvare 5.6 Problema colorrii hrilor


Competena: Utilizeaz tehnicile de programare Obiectivul vizat: S fii capabil s nelegi i s-i nsueti algoritmul prezentat. S fii capabil s exemplifici pe algoritm pentru o valoare dat n. Durata: 25 minute

Tipul activitii: Studiu de caz Sugestii: Elevii vor lucra individual fiecare la un calculator sau pe grupe la laborator. Sarcina de lucru: Fiind dat o hart cu n ri, se cer toate soluiile de colorare a hrii, utiliznd cel mult 4 culori, astfel nct 2 ri cu frontiera comun s fie colorate diferit. Este demonstrat

matematic faptul c sunt suficiente numai 4 culori pentru ca orice hart s fie colorat astfel.

1 4 2 5 Pentru exemplificare, vom considera harta de mai sus unde rile sunt numerotate cu cifre cuprinse ntre 1 i 5: 3

Harta este furnizat programului cu ajutorul unei matrice (tablou)

An , n

1, tara i are frontiera cu tara j A(i, j) = altfel 0,


Matricea A este simetric. Pentru rezolvarea problemei se utilizeaz stiva st , unde nivelul k al stivei simbolizeaz ara k, iar st[k] culoarea ataat arii k. Stiva are nlimea n i pe fiecare nivel ia valori intre 1 i 4. #include<iostream.h> int st[10],a[20][20],n,k; void init() {st[k]=0;} int am_succesor() {if(st[k]<4) {st[k]++; return 1;} else return 0; } int e_valid() {for(int i=1;i<=k-1;i++) if(st[i]==st[k] && a[i][k]==1) return 0; return 1; } int solutie() {return k==n;} void tipar() {cout<<"Varianta"<<endl; for(int i=1;i<=n;i++) cout<<"Tara"<<i<<"culoarea"<<st[i]<<endl; cout<<endl; }

void back() {int as; k=1;Init(); while(k>0) { do {} while ((as=am_succesor()) && !e_valid()); if (as) if (solutie()) tipar(); else {k++;Init();} else k--; } } main() {cout<<"Numar de tari";cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=i-1;j++) {cout<<"a["<<i<<","<<j<<"]=";cin>>a[i][j]; a[j][i]=a[i][j]; } back(); } O soluie a acestei probleme este urmtoarea: ara 1 culoarea 1 ara 2 culoarea 2 ara 3 culoarea 1 ara 4 culoarea 3 ara 5 culoarea 4 Care sunt urmtoarele dou soluii?

Activitatea de nvare 5.7 Problema comis- voiajorului


Competena: Utilizeaz tehnicile de programare Obiectivul vizat: S fii capabil s scrii corect un program cu tehnica Backtracking standard. S fii capabil s identifici un algoritm cu care se aseamn. S fii capabil s implementezi algoritmul gsit. Durata: 25 minute

Tipul activitii: Exerciiul practic Sugestii: Elevii vor lucra individual sau pe grupe la laborator. Sarcina de lucru: Un comis-voiajor trebuie s viziteze un numr de n orae. Iniial, acesta se afl ntr-unul dintre ele, notat 1. Comis-voiajorul dorete s nu treac de dou ori prin acelai ora,

iar la intoarcere sa revin n oraul 1. Cunoscnd legturile existente ntre orae, se cere s se tipreasc toate drumurile posibile pe care le poate efectua comis-voiajorul.

n figura de mai jos sunt simbolizate, pentru n=6, cele 6 orae, precum i drumurile existente ntre ele. 2 1 3

Comis-voiajorul are urmtoarele posibiliti de parcurgere: 1,2,3,4,5,6,1 1,2,5,4,3,6,1 1,6,3,4,5,2,1 1,6,5,4,3,2,1

Tema 5. Tehnica de programare Backtracking


Fia de documentare 5.3 Backtracking recursiv.
n fia suport 5.1 am prezentat tehnica Backtracking clasic, iterativ, iar n fia suport 5.2 am rezolvat cteva probleme cu aceast tehnic. Pentru tehnica Backtracking recursiv, soluiile finale st[i] sunt generate n cadrul funciei back_recursiv(int k), unde k reprezint nivelul pn la care s-a ajuns pe stiv. Adic la fiecare execuie din lanul de auto-apeluri, funcia back_recursiv trateaz nivelul k al stivei. Algoritmul recursiv de backtracking este prezentat mai jos n limbajul pseudocod. back_recursiv( int k) pentru contor de la <v1> la <vn> execut st[k]contor dac valid(k) atunci dac<soluia este final> atunci apel tipar altfel auto-apel back_recursiv(k+1) sfrit dac sfrit dac sfrit pentru ntrun ciclu, prin variabila contor vor trece pe rnd toate valorile din intervalul <v1> la <vn> care ar putea fi ncercate pe nivelul k al stivei. La fiecare pas al ciclului, pentru fiecare dintre valorile variabilei contor: Se memoreaz pe nivelul k valoarea contor prin st[k]contor. Se obine astfel soluia parial(st[1],st[2],,st[k]). Se verific dac aceast soluie este valid prin funcia valid(k). Dac da atunci se verific dac soluia este final : - Dac este soluie final atunci se apeleaz funcia tipar; - n caz contrar, avem o soluie valid dar care nu este i final.Vom . urca la nivelul urmtor n stiv prin apelul back_recursiv(k+1). Algoritmul se reia de lacapt, dar cu k+1 n loc de k.

Activitatea de nvare 5.8 Problema damelor rezolvat recursiv


Competena: Utilizeaz tehnicile de programare Obiectivul vizat: S fii capabil s nelegi i s-i nsueti algoritmul de backtracking recursiv prezentat. S determini modul de iniializare al stivei, gsirea succesorului i ajungerea la soluie. S fii capabil s exemplifici pe algoritm pentru o valoare dat n. Durata: 35 minute

Tipul activitii: Studiu de caz Sugestii: Elevii vor lucra individual fiecare la un calculator sau pe grupe la laborator.

Sarcina de lucru: Se cere gsirea tuturor soluiilor de aezare pe tabla de ah de n linii i n coloane a n dame, astfel nct ele s nu se atace. Se consider c ele se atac dac sunt pe aceeai linie, coloan sau diagonal. Exemplificai pentru n=4. Cum se face iniializarea, cum se gsete un successor i cum se ajunge la soluie? Varianta recursiv este urmtoarea: #include <stdio.h> #include <conio.h> #include <iostream.h> #define nmax 10 int n; /*dimensiunea (ordinul) tablei de ah */ int nr_solutie; int x[nmax]; int valid(int k) { /*testeaz condiiile de continuare */ int p; for(p=1;p<=k-1;p++) if((x[k]==x[p]) || (abs(k-p) == abs(x[k]-x[p]))) return 0; return 1; } void back_recursiv(int k) { int i,j,p; for(j=1;j<=n;j++) { x[k]=j; if(valid(k)==1) if(k<n) back_recursiv(k+1); else { /*tiprirea soluiei */ nr_solutie++; cout<<"\nSOLUTIA nr. " <<nr_solutie); for(i=1;i<=n;i++) { for(p=1;p<=n;p++) if(x[i]==p) cout<<"1"; else cout<<0<<endl; }; getch(); } } } void main() { cout<<"\nOrdinul tablei de sah n="; cin>>n; nr_solutie=0; back_recursiv(1); cout<<"\nSFARSIT\n"; }

Activitatea de nvare 5.9 Probleme rezolvate recursiv


Competena: Utilizeaz tehnicile de programare Obiectivul vizat: S identifici probleme a cror rezplvare necesit tehnica Backtracking recursiv. S fii capabil s aplici tehnica Backtracking recursiv. S identifici algoritmul de rezolvare. S implementezi algoritmul gsit. S gseti date de intrare corespunztoare tuturor cazurilor problemei pentru testarea programulului. Durata: o sptmn

Tipul activitii: Proiect Sugestii: Elevii vor lucra individual sau pe grupe la laborator acas sau la laborator. Sarcina de lucru: S se realizeze un portofoliu de minim 7 probleme ce au ca algoritm de rezolvare tehnica Backtracking recursiv. Se va urmri: - concordan tem- realizare - capacitate de analiz i sintez a informaiei - originalitate - prezena comentariilor n program - testarea datelor de intrare I soluiile obinute - lucrul n echip - design - prezentarea proiectului

Tema 6. Tehnica de programare Greedy


Fia de documentare 6.1 Descrierea tehnicii
Este practic imposibil s fie dat forma general, a unei probleme rezolvabile cu tehnica Greedy, totui. S considerm o mulime A cu n elemente. Se cere o submulime a sa cu m<=n elemente (n cazul m=n este important ordinea alegerii elementelor), astfel nct s fie ndeplinite anumite condiii (acestea difer de la o problem la alta). Exemplu: se consider o mulime de n numere reale. Se cere o submulime a sa, astfel nct suma elementelor sale s fie maxim. Pentru rezolvare, se va alege un prim element al mulimii de numere reale. Dac este posibil, acesta va fi adugat soluiei, iniial vide. Posibilitatea ca acesta s fie adugat este dat de semnul numrului (acesta trebuie s fie mai mare ca 0). Se alege un al doilea numr, cu care se procedeaz n mod asemntor.a.m.d. Algoritmul se ncheie cnd au fost alese i eventual adugate toate elementele mulimii. Pentru a rezolva o problem cu Greedy, soluia se construiete, dup regula: pentru fiecare element care urmeaz s fie adugat soluiei finale, se efectueaz o alegere a sa din elementele mulimii A (dup un mecanism specific fiecrei probleme n parte), iar dac este posibil, acesta este adugat. Algoritmul se termin fie cnd a fost gsit soluia cerut, fie cnd s-a constatat inexistena acesteia. Intuitiv, alegem un element, al doilea,...pn cnd obinem ce dorim sau pn cnd au fost testate toate elementele mulimii. De aici provine i numele tehnicii, greedy (lacom).

Definiie Tehnica Greedy poate fi privit ca o particularizare a tehnicii Backtracking, n care se renun la mecanismul de ntoarcere. Ambele tehnici ofer soluii sub form de vector. Tehnica Backtracking poate oferi toate soluiile problemei, n timp ce tehnica Greedy ofer o singur soluie.

Tehnica Greedy nu dispune de mecanismul ntoarcerii, specific tehnicii Backtracking. Aceasta este diferena esenial dintre cele dou tehnici, diferen care are consecine uriae n ce privete aplicabilitatea lor. Consecina 1. Este necesar ca cel care elaboreaz un algoritm Greedy s tie faptul c, procednd n modul ales de el, ajunge la rezultatul dorit. Pentru fiecare problem n parte, dup ce se identific un algoritm, este obligatoriu s se demonstreze c acesta conduce la soluia optim. Demonstraia faptului c se ajunge la soluia optim este specific fiecrei probleme n parte. Tehnica Greedy conduce la timp de calcul polinomial Consecina 2. Motivul care conduce la acest timp de calcul, ine de mecanismul tehnicii. S presupunem c mulimea din care se face alegerea are n elemente i c soluia are tot

n elemente (caz maxim). Se fac n alegeri, la fiecare alegere se fac n teste, rezult un algoritm cu timp O(n2). Schema general Greedy Selectarea elementelor ce formeaz soluia De multe ori, este necesar ca elementele mulimii A s fie sortate, pentru ca apoi s alegem din acestea, iar sortarea necesit un timp minim O(nxlog 2n). ns sortarea se efectueaz la nceput. Pentru cele mai multe probleme, nu se cunosc algoritmi Greedy. Generarea i afiarea soluiei. Deoarece soluia problemelor ce se rezolv cu acest tehnic este sub form de vector, acesta se completeaz pas cu pas i apoi se afieaz. Avantajul tehnicii Avantajul timpului polinomial, conduce la necesitatea utilizrii tehnicii Greedy. Pentru problemele pentru care nu se cunosc algoritmi care necesit timp polinomial, se caut soluii, chiar dac nu optime, dar apropiate de acestea, dar care au fost obinute n timp util. Multe din aceste soluii sunt obinute cu Greedy. Concluzii Metoda rezolv probleme de optim n care soluia se construiete pe parcurs. Optimul global se determin prin estimri succesive ale optimului local. Dintr-o mulime de elmente A trebuie determinat o submulime B, care verific anumite condiii i care, de obicei, este soluia unei probleme de optimizare. Soluia problemei se construiete treptat. Iniial B este mulimea vid. Se adaug n B succesiv elemente din A, atingndu-se de fiecare dat un optim local. Dar, aceast contruire nu asigur ntodeauna atingerea unui optim global. De aceea tehnica Greedy nu poate fi aplicat dect dac se demonstreaz c modul de construire a mulimii B duce la obinerea unui optim global. Datorit modului de construire a soluiei, tehnica se mai numete tehnica optimului local.

Activitatea de nvare 6.1 Exerciii de fixare a cunotinelor teoretice


Competena: Utilizeaz tehnicile de programare Obiectivul vizat: S fii capabil s-i fixezi anumite informaii prezentate. Durata: 10 minute

Tipul activitii: Completeaz spaiile libere Sugestii: Elevii vor lucra individual fiecare pe caiet la clas.

Sarcina de lucru: S se completeze spaiile libere din textul de mai jos, folosind noiunile nvate la fia de documentare 6.1. Numele metodei nseamn ... . Tehnica Greedy poate fi privit ca o particularizare a tehnicii ... n care se renun la mecanismul de ntoarcere. Ambele tehnici ofer soluii sub form de .... Tehnica Backtracking poate oferi ... soluiile problemei, n timp ce tehnica Greedy ofer ... soluie. Tehnica Greedy conduce la timp de calcul .... Soluiile se construiesc ... pas. Pentru multe probleme .. se cunosc algoritmi Greedy. Schema general Greedy are prima etap ... i a doua etap....

Activitatea de nvare 6.2 Problema spectacolelor


Competena: Utilizeaz tehnicile de programare Obiectivul vizat: S fii capabil s nelegi i s-i nsueti algoritmul Greedy prezentat. S fii capabil s exemplifici pe algoritm pentru o valoare dat n. Durata: 35 minute

Tipul activitii: Studiu de caz Sugestii: Elevii vor lucra individual fiecare la un calculator sau pe grupe la laborator. Sarcina de lucru: ntr-o sal, ntr-o zi, trebuie planificate n spectacole. Pentru fiecare spectacol se cunoate intervalul n care se desfoar:[st, sf]. Se cere s se planifice un numr maxim de spectacole astfel nct s nu se suprapun. Exemplificai pentru n=5, cu unele spectacole care au ora de terminare peste ora de nceput a altora. Rezolvare Fie o planificare optim a spectacolelor(un numr maxim k de spectacole i 1,i2,...ik, unde i1,i2,...ik {1,2,..n} i spectacolul ij are lor naintea spectacolului i j+1).O astfel de planificare ndeplinete condiia: spectacolul i j+1 ncepe dup terminarea spectacolului ij. O consecin imediat a condiiei de mai sus este: spectacolul i j ia sfrit naintea terminrii spectacolului ij+1 (consecina nu implic un efort de gndire deosebit). Vom construi o soluie dup urmtorul algoritm: 1) sortm spectacolele dup ora terminrii lor; 2) primul spectacol programat este cel care se termin cel mai devreme;

3) alegem primul spectacol dintre cele care urmeaz n ir ultimului spectacol programat, care ndeplinete condiia c ncepe dup ce s-a terminat ultimul spectacol programat; 4) dac tentativa de mai sus a euat (nu am gsit un astfel de spectacol) algoritmul se termin, altfel se programeaz spectacolul gsit i algoritmul se reia de la pasul 3. Algoritmul de mai sus conduce la soluia optim(numr maxim de spectacole programate). Acest program se ncadreaz n tehnica Greedy pentru c: la un pas se alege un spectacol cu ora de ncepere mai mare dect ora de terminare a ultimului spectacol programat i este adugat soluiei. Odat adugat (programat) un spectacol, acesta rmne n cadrul soluiei. #include<iostream.h> int s[2][10],o[10],n,I,h1,m1,h2,m2,ora; void sortare() { int gata,m,i; do { gata=1; for(i=1;i<=n-1;i++) if (s[1][o[i]]>s[1][o[i+1]]) { m=o[i] ; o[i]=o[i+1]; o[i+1]=m; gata=0;} } while (!gata); } main() {int i; cout<<"n=";cin>>n; for(i=1;i<=n;i++) {o[i]=i; cout<<"ora de inceput pentru spectacol "<<i<<" (hh mm)="; cin>>h1>>m1; s[0][i]=h1*60+m1; cout<<"ora de sfarsit pentru spectacolul "<<i<<" (hh mm)="; cin>>h2>>m2; s[1][i]=h2*60+m2; } sortare(); cout<<"ordinea spectacolelor este"<<endl<<o[1]<<endl; ora=s[1][o[1]]; for(i=2;i<=n;i++) if (s[0][o[i]]>=ora) {cout<<o[i]<<endl; ora=s[i][o[i]];} }

Activitatea de nvare 6.3 Problema continu a rucsacului


Competena:

Utilizeaz tehnicile de programare Obiectivul vizat: S fii capabil s scrii un algoritm cnd se descrie modul de rezolvare al problemei. S fii capabil s implementezi algoritmul. S fii capabil s testezi programul pentru valori date. Durata: 45 minute

Tipul activitii: Exerciiul practic Sugestii: Elevii vor lucra individual sau pe grupe la laborator. Sarcina de lucru: O persoan are un rucsac cu care poate transporta o greutate maxim G. Persoana are la dispoziie n obiecte i cunoate pentru fiecare obiect greutatea i ctigul care se obine n urma transportului su la destinaie. Se cere s se precizeze ce obiecte trebuie s transporte persoana n aa fel nct ctigul sa fie maxim tiind c obiectele se pot tia. Algoritmul este urmtorul: se calculeaz, pentru fiecare obiect n parte, eficiena de transport rezultat prin mprirea ctigului la greutate (de fapt, acesta reprezint ctigul obinut prin transportul unitii de greutate); obiectele se sorteaz n ordine descresctoare a eficienei de transport i se preiau n calcul n aceast ordine; ctigul iniial va fi 0, iar greutatea rmas de ncrcat va fi greutatea rucsacului; att timp ct nu a fost completat greutatea maxim a rucsacului i nu au fost luate n considerare toate obiectele, se procedeaz astfel: dintre obiectele nencrcate se selecteaz acela cu cea mai ridicat eficien de transport i avem dou posibiliti: acesta ncape n totalitate n rucsac, deci se scade din greutatea rmas de ncrcat greutatea obiectului, la ctig se cumuleaz ctigul datorat transportului acestui obiect; se tiprete 1, n sensul c ntregul obiect a fost ncrcat; obiectul nu ncape n totalitate n rucsac, caz n care se calculeaz ce parte din el poate fi transportat, se cumuleaz ctigul obinut cu transportul acestei pri din obiect, se tiprete procentul care s-a ncrcat din obiect, iar greutatea rmas de ncrcat devine 0. S se exemplifice pentru: Greutatea care poate fi transportat cu ajutorul rucsacului aste 3 Avem la dispoziie 3 obiecte. Greutatea i ctigul pentru fiecare obiect sunt prezentate mai jos:

III. Glosar
Algoritm: metod sau o procedur de calcul, alctuit din pai elementari necesari pentru rezolvarea unei probleme sau categorii de probleme. Apel: chemare. Backtracking: o tehnic de rezolvare a unor probleme ce au soluia sub form de vector i la care se cer toate soluiile. Se construiete soluia pas cu pas x1,x2,xn, dac se constat c pentru o valoare aleas, nu avem cum s ajungem la soluie, se renun la acea valoare i se reia cutarea din punctul n care am rmas. Divide et Impera: o tehnic special prin care se pot rezolva anumite probleme. Divide et Impera se bazeaz pe un principiu extrem de simplu: descompunem problema n dou sau mai multe subprobleme (mai uoare), care se rezolv, iar soluia pentru problema iniial se obine combinnd soluiile problemelor n care a fost descompus. Greedy: tehnic de rezolvare a unor probleme, asemntoare cu tehnica Backtracking, ns nu are mecanismul de revenire i genereaz doar o singur soluie. Iteraie: care poate fi repetat n mod nelimitat; Metod: ansamblu de mijloace socotite proprii pentru realizarea unui scop; mod de executare a unui lucru; Program: reprezint un set de instruciuni prin care se comunic unui calculator cum s efectueze un anumit grup de operaii. Programare: operaia de elaborare a programului n vederea rezolvrii unei probleme cu calculatorul electronic; Recursiv: repetare a unui anumit procedeu de calcul prin aplicarea lui la rezultatul calculului din etapa precedent; Stiv: tip special de list n care toate inseriile i suprimrile de noduri au loc la un singur capt, numit vrf. Subprogram: parte a unui program; Tehnic: metode i capaciti pentru aplicaii practice ale tiinelor naturii.

IV. Bibliografie
1. Sorin, Tudor (1998). Tehnici de programare,Bucuresti:Editura PegasuS. 2. Mateescu, Daniel George. Moraru, Florin Pavel(2006). Informatica pentru liceu si bacalaureat Materia de clasa a XI-a, Sibiu: Editura Donaris. 3. Cerchez, Emanuela. erban, Marinel.(2005) Programarea in limbajul C/C++ volumul 2, Bucuresti:Editura Polirom. 4. Milosescu, Mariana.(2005) Informatica clasa a X-a, Bucuresti: Editura Diactica si Pedagogica. 5. Sorin, Tudor. (2008) Informatica clasa a IX si X a , Bucuresti: L&S Info-Mat. 6. ***. La http://www.timsoft.ro/aux/module/modul11.html 02.05.2009 7. ***. La http://labs.cs.utt.ro/labs/sdaa/html/sda/l1.html 04.05.2009 8. *** La http://ro.wikipedia.org/wiki/Divide_et_impera 15.08.2009 9. *** La www.educativ.ro 12.05.2009 10. *** La http://www.scribd.com/doc/8066145/Metoda-Backtracking 13.05.2009 11. *** La www.didactic.ro/files/12/metoda_greedy.doc 13.05.2009 12. *** La http://www.advancedelearning.ro/materiale/cataloage/ro/cat_inf_ro.pdf 13.05.2009 13.*** La http://portal2.ise.ro la 14.05.2009