Vous êtes sur la page 1sur 58

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
MEODE !" E#$"%" %&'S"%E DE PRO(R'M'RE
Material de predare ) partea "
Do*eniul+ "nfor*atic,
%alificarea+ 'nali-t pro.ra*ator
$i/el 3 a/an-at
2000
'UOR+
ROM'$' S1&12'$) profesor grad didactic
%OORDO$'OR+
M'R"'$' 3"O&E' %"O4'$U - Profesor, grad didactic , Colegiul Tehnic
"Media Bucureti
%O$SU&'$51+
"O'$' %6RSE' expert CNDPT
7O"%' 3&1DU5 expert CNDPT
'$(E&' POPES%U expert CNDPT
D'$' SRO"E expert CNDPT
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 2007-
2013
2
%uprin-
.ntroducere.................................................................................................4
.Documente necesare pentru activitatea de predare..................................6
. Resurse...................................................................................................7
Tema 1. Noiunea de recursivitate......................................................................7
Fia suport 1.1...................................................................................................................7
Tema 2. Recursivitate i iterativitate...............................................................................12
Fia suport 2.1 Algoritmi care implementeaz definiii recursive....................................12
Fia suport 2.2 Tipuri de algoritmi de traversare i inversare a unei structuri................15
Fia suport 2.3 Tipuri de algoritmi de divizare................................................................20
Fia suport 2.4 Tipuri de algoritmi recursivi cu revenire..................................................23
Fia suport 2.5 Algoritmi recursivi i iterativi...................................................................26
Tema 3. Avantajele i dezavantajele utilizrii recursivitii...............................29
Fia suport 3.1 Eliminarea recursivitii...........................................................................29
Tema 4. Tehnica de programare " Divide et mpera........................................33
Fia suport 4.1 Descriere general ................................................................................33
Tema 5. Tehnica de programare Backtracking ................................................36
Fia suport 5.1 Descrierea tehnicii ................................................................................36
Fia suport 5.2 Backtracking recursiv.............................................................................44
Tema 6. Tehnica de programare Greedy ........................................................50
Fia suport 6.1 Descrierea tehnicii.................................................................................50
V. Fia rezumat.........................................................................................56
V. Bibliografie.............................................................................................58

"8 "ntroducere
Materialele de predare reprezint o resurs suport pentru activitatea de predare,
respectiv instrumente auxiliare care includ un mesaj sau o informaie didactic.
Prezentul material de predare, se adreseaz cadrelor didactice care predau n cadrul
colilor postliceale, domeniul "nfor*atic,, calificarea 'nali-t pro.ra*ator8
Modulul e9nici cla-ice de pro.ra*are cuprinde competenele din unitatea de
competen tehnic specializat Utili:area *etodelor ;i te9nicilor cla-ice de
pro.ra*are din cadrul structurii programului pentru ni/el 3 a/an-at.
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.
Modulul e9nici cla-ice de pro.ra*are se studiaz n anul i are o durat de 8
sptmni totaliznd un numar de 120 de ore din care 60 de teorie i 60 de laborator
tehnologic. n primele dou sptmni se studiaz cte 12 ore pe sptmn (parte
teoretic i practic) iar n restul de ase sptmni se studiaz cte 6 ore pe
sptmn (parte teoretic si practic) n paralel cu modulul Baze de date.
Astfel: n primele dou sptmni se studiaz 12 ore pe sptmn activiti teoretice,
respectiv 12 ore laborator tehnologic, iar urmtoarele 6 sptmni se studiaz cte 6
ore activiti teoretice, respectiv 6 ore laborator n paralel cu activitile teoretice i
aplicative din modulul Baze de date.
Coninuturile au fost ntocmite corelnd Criteriile de Performan, precum i Condiiile
de Aplicabilitate. Cadrele didactice au posibilitatea de a decide asupra numrului de ore
alocat fiecrei teme, n funcie de dificultatea acesteia, de nivelul de cunotine
anterioare ale grupului instruit, de complexitatea materialului didactic implicat n
strategia didactic i ritmul de asimilare a cunotinelor, i de formare a deprinderilor,
proprii grupului instruit.
ntre competene i coninuturi exist o relaie bine determinat: atingerea
competenelor implic coninuturile tematice, iar parcurgerea acestora asigur
dobndirea de ctre elevi a competenelor dorite.
Pentru construirea competenelor dorite, activitile de predare vor avea un caracter
activ, interactiv , cu pondere sporit pe activitile practice (mai puin pe cele teoretice)
i pe activitile ce privesc exersarea abilitilor cheie.
Ordinea de parcurgere a temelor aferente coninuturilor din curriculum rmne la
alegerea cadrelor didactice, cu condiia respectrii succesiunii logice n abordarea
acestora.
a<elul de corelare a co*petenelor cu te*ele ;i fi;ele -uport core-pun:,toare
coninuturilor

%o*petene e*e Fi-e -uport
Aplic principiile
recursivitii i
iterativitii n
rezolvarea
problemelor
Tema 1 Noiumea de
recursivitate
Fia 1.1
Elementele recursivitii
Tema 2 Recursivitate i
iterativitate
Fia 2.1
Tipuri de algoritmi recursivi
Tema 3 Avantajele i
dezavantajele utilizrii
recursivitii
Fia 3.1 Eliminarea
recursivitii
Utilizeaz
tehnicile clasice
de programare
Tema 4 Tehnica de programare
" Divide et mpera "
Fia 4.1 Descrierea
general
Fia 4.2 Aplicaii practice
Tema 5 Tehnica de programare
Backtracking
Fia 5.1 Descrierea
metodei
Fia 5.2 Backtracking
recursiv
Tema 6 Tehnica de programare
Greedy
Fia 6.1 Descriera metodei
Absolvenii nivelului 3 avansat, coal postliceal, calificarea Analist programator , vor fi
capabili s aplice principiile recursivitii i iterativitii n rezolvarea problemelor i s
utilizeze tehnicile clasice de programare.
5
""8 Docu*ente nece-are pentru acti/itatea de predare
Pentru predarea coninuturilor abordate n cadrul materialului de predare, cadrul
didactic are obligaia de a studia urmtoarele documente:
Standardul de Pregtire Profesional pentru calificarea Analist programator,
nivelul 3 avansat www.tvet.ro, seciunea SPP sau www.edu.ro , seciunea
nvmnt preuniversitar
Curriculum pentru calificareaAnalist programator, nivelul 3 avansat
www.tvet.ro, seciunea Curriculum sau www.edu.ro , seciunea nvmnt
preuniversitar
Alte surse pot fi:
Informatic !etodica predrii informaticii i tehnologiei informaiei. Craiova.
Editura Arves;
Cri de specialitate;
Reviste de specialitate;
Ghiduri de redactare, de exemplu: Chelcea, Septimiu[1999].(2007). Cum s
redactm Bucureti. Editura: Comunicare.ro
6
"""8 Re-ur-e
e*a 18 $oiunea de recur-i/itate
Fi;a -uport 181
Noiunea de recursivitate este fundamental n informatic. Utilizarea frecvent a ei s-a
fcut dup anii 80. Multe din limbajele de programare evoluate i mult utilizate Fortran,
Cobol nu permiteau scrierea programelor recursive.
Definiie
Procesul recursiv este procesul care, n timpul execuiei, genereaz apariia unor
procese identice, aflate n legtur direct cu procesul ce le genereaz.Un proces poate
fi descris printr- un subprogram.
Aadar recursivitatea este un mecanism general de elaborare a programelor, care
const n posibilitatea ca un subprogram s se autoapeleze.
Recursivitatea a aparut din necesiti practice date de transcrierea direct a formulelor
matematice recursive. n timp acest mecanism a fost extins, fiind utilizat n elaborarea
multor algoritmi.
Sugestii metodologice
Pentru predarea acestor coninuturi este necesar s se dea cteva exemple intuitive de
procese recursive din realitatea cotidian.
18 O camer de luat vederi are n obiectiv un televizor care transmite imaginile primite
de la camer. n televizor se va vedea un televizor, iar n acesta, un televizor.,.a.m.d.
Pe scurt, n orice telvizor se vede un televizor
2. n anumite localuri ntlnim anunul ' Azi nu se fumeaz'.
Cerem elevilor s gseasc exemple de procese recursive din mediul nconjurtor.
"tunci cnd scriem un algoritm recursiv, este suficient s gndim e#act ce se
ntmpl la un anumit nivel, pentru c la orice nivel se ntmpl e#act acelai lucru
$#emplele pre%entate sunt procese recursive infinite, pre%entnd un ir infinit de
televi%oare, respectiv anunul este perpetuu
&n algoritm recursiv corect tre'uie s se termine, contrar programul se va termina cu
eroare i nu vom primi re%ultatul ateptat Procesele descrise prin su'program sunt
procese finite Condiia de terminare va fi pus de ctre programator
Elementele recursivitii sunt
Procesul care se repet;
Motorul;
Condiia de terminare.
A nu se uita condiia de terminare, de oprire a autoapelului procesului.
Su.e-tii *etodolo.ice
Se atrage atenia elevilor ca recursivitatea s fie definit corect. Prin urmare este
obligatoriu s avem cazuri elementare care se pot rezolva direct, adic o condiie de
oprire. O greeal frecvent este nclcarea acestui principiu.
Se recomand identificarea acestor elemente in exemplele prezentate.
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. O parte din memoria intern
rezervat programului este alocat stivei ( segmentului de stiv). Un registru al
microprocesorului reine n permanen adresa bazei stivei, altul adresa vrfului ei. La
apelul unui subprogram 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 uurint 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. nstruciunile 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 .
Sugestii metodologice
Evocarea
Elevii fac brainstorming individual in legatur cu noiunea de recursivitate i folosesc o
modalitate de organizare grafic pentru a ilustra relaiile dintre idei (Ciorchinele iniial).
n perechi, elevii coreleaz informaiile gsite i completeaz ciorchinele inceput de ei
pe caiet.
Profesorul adun informaiile (reprezentarea grafic a brainstormingului) i le trece pe
tabl indiferent dac au legatur sau nu cu lecia.
Se activizeaza cunotinele oferite de elevi pentru ai stimula s pun intrebri.
8
!efle"ia
Se ncearc provocarea la o discuie prin care elevii s exprime cu propriile lor cuvinte
ideile i informaiile gsite n material.
Se mobilizeaz elevii ntr-o discuie n care se ntlnesc mai multe modele de gndire
pentru ca fiecare din ei s-i construiasc o schem personal de gndire pentru a
aplica n practic ceea ce au nvat.
Elevii care doresc citesc ceea ce au scris i argumenteaz de ce au ales acest acest
mod de structurare a informaiilor pe recursivitate.
Se completeaz ciorchinele de pe tabl pentru ca in final s avem un ciorchine revizuit,
cu completrile i corectarea informaiilor. Se organizeaz informaiile i se fixeaz mai
bine prin vizualizare.
E=e*plificare
S se calculeze n!, n natural.
Pentru a scrie o functie recursiv prelum din matematic relaia:
n! =fact(n)=

=
altfel n n
n
, )! 1 ( *
0 , 1
n, N
Pentru n=3, avem 3!=f(3)=3*f(2)=3*2*f(1)=3*2*1*f(0)= 3*2*1*1=6
Funcia recursiv fact transcrie in C++ definiia de mai sus.
int fact(int n){
if(n==0) -condiie de terminare a apelului
return 1;
return n*fact(n-1); -apel recursiv
}
Observaie: tipul funciei trebuie s devin long pentru n>=8 ( 8!>32767 ).
Funcionarea subprogramului de mai sus, pentru n=3 este:
se apeleaz funcia fact pentru n=3;
n este diferit de 0 i se apeleaz fact pentru n=2 (calculatorul va reine n
stiva proprie valoarea 3, apoi, la apel, va creea un nou nivel pentru stiv n
care depune valoarea 2);
n este diferit de 0 i se apeleaz fact pentru n=1 (calculatorul va crea un nou
nivel n care depune valoarea 1);
n este diferit de 0 (n=1) se apeleaz fact pentru n=0 (calculatorul depune 0 n
stiv);
cum n este 0,fact va lua valoarea 1 i se revine din apel;
n urma apelului trebuie nmulit 1 (valoarea gsit pe stiv la nivelul
corespunztor) cu 1 (valoarea cu care s-a revenit din apel), rezultat 1 i se
revine din apel;
se face nmulirea cu 2 (valoarea gsit pe nivel) cu 1 (valoarea ntoars)
rezultat 2 i se revine din apel;
9
se nmulete 3 (valoarea gsit pe stiv) cu 2 (valoarea cu care s-a revenit,
rezultatul este 6 i se revine din apel (de data asta revenirea se face n
programul principal,ntrucat stiva este vid);
valoarea returnata va fi 6.
S observ c, n acest exemplu, calculele se efectueaz la revenirea din apel. Valorile
au fost reinute n stiv, iar la revenire au fost folosite pentru nmulire.
%ondiia de oprire
Apelul recursiv al unei funcii trebuie s fie condiionat de o decizie care s mpiedice
apelul n cascad ( la infinit ); aceasta ar duce la o eroare de program - depirea stivei.
Un program recursiv poate fi exprimat: P=M(
k
,P) , unde M este mulimea ce conine
instruciunile
k
i pe P insui.
E"emplu:
void p( ) - funcie recursiv
{
p(); - apel infinit
}
Apelul funciei p() trebuie s fie condiionat n una din variantele:
if(cond) p();
while(cond) p();
do p() while(cond).
Verificarea i simularea programelor recursive
Se face printr-o demonstraie formal, sau testnd toate cazurile posibile. Se verific
nti dac toate cazurile particulare (ce se execut cnd se ndeplinete condiia de
terminare a apelului recursiv) funcioneaz corect. Se face apoi o verificare formal a
funciei recursive, pentru restul cazurilor, presupunnd c toate componentele din codul
funciei funcioneaz corect.
Verificarea este inductiv. Acesta e un avantaj al programelor recursive, ce permite
demonstrarea corectitudinii lor simplu i clar.
Su.e-tii *etodolo.ice
U$DE > Coninutul poate fi predat n sala de clas cu un videoproiector, sau n
laboratorul de informatic .
%UM >
10
Se recomand i folosirea unor secvene din leciile de recursivitate ale bibliotecii AEL
pentru o mai bun nelegere a mecanismului recursiv, alturi de clasica tabl i creta
alb, precum i un flipchart pentru realizrile elevilor cu propriile exemple.
Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi pentru gsirea unor exemple
recursive cotidiene.
%a *ateriale -uport se pot folosi:
Fia de documentare 4.1 : Su'programe, modulul 4.
O prezentare multimedia care s cuprind urmtoarele noiuni+ proces recursiv,
motor, condiie de oprire.
Activiti interactive, de genul urmator+ conversaie, studiu de caz, tehnica
'ciorchinele'.
Ca materiale de evaluare se pot folosi: probe practice i scrise, precum i
planele - proiect realizate de elevi. De exemplu
Proiect realizat de elevii clasei a X a sub conducerea doamnei profesor Adriana
Chere, prof. gr. , Liceul Teoretic "Nicolae Blcescu", Cluj- Napoca
11
e*a 28 Recur-i/itate ;i iterati/itate
Fi;a -uport 281 'l.orit*i care i*ple*entea:, definiii recur-i/e8
Definiie
O definiie recursiv este definiia n care un obiect se definete prin el insui. Definiia
conine o condiie de terminare, indicnd modul de prsire a definiiei i o parte ce
precizeaz definirea recursiv propriu-zis.
Ca exemple: factorialul, algoritmul lui Euclid de aflare a celui mai mare divizor comun a
dou numere date naturale, irul lui Fibonacci , calculul funciei Manna-Pnueli, funcia
lui Ackermann, suma cifrelor unui numr natural, etc.
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.
E"emplu 1.
Se dau dou numere naturale a i b. Se cere s se calculeze cel mai mare divisor
comun al lor folosind algoritmul lui Euclid. Pentru rezolvare, utilizm o definiie recursiv
a celui mai mare divizor comun pentru dou numere naturale a i b.
Cmmdc(a,b)=

<
>
=
b a a b a cmmdc
b a b b a cmmdc
b a a
), , (
), , (
,
Aceast formul este transmis n funcia recursiv cmmdc.
#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;
12
cout<<"ntroduceti numerele: "; cin>>a>>b;
cout<<"cmmdc dintre "<<a<<" i "<<b<<" este "<<cmmdc(a,b);
}
E"emplu 2.
Fie fib: N

N. S se calculeze fib(n), pentru n natural.


Fib(n)=

+
=
=
) 2 ( ) 1 (
1 , 1
0 , 1
n fib n fib
n
n
in rest
#include<iostream.h>
nt 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?
E"emplu 3.
Calculul funciei Manna-Pnueli pentru un x intreg.:
F(x)=

< +
> =
12 ), 2 ( (
12 . , 1
x x F F
x x
Transpunem formula ntr-o funcie recursiv:
# include <iostream.h>
nt manna(int x)
{ if(x>=12) return x-1;
else return manna(manna(x+2));
}
void main()
{ int x;
cout<<n=;
cin >>n;
cout<<mana(x);
}
E"emplu ?.
13
Se d funcia lui Ackermann, definit mai jos. Se citesc numerele m i n naturale. S se
calculeze Ack(m,n).
Ack(m,n)=


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

Ce se ntmpl pentru valori mici ale lui m i n ? De exemplu, Ack(4,4).
ncercai..
E"emplu @.
S se calculeze recursiv suma cifrelor unui numr natural.
ndicatie: 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:
S(n)=

+
=
altfel n S n
n
), 10 / ( 10 %
0 , 0
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);
}
Su.e-tii *etodolo.ice
U$DE > Coninutul poate fi predat doar n laboratorul de informatic, indicat fiecare
elev s aiba locul lui la calculator.
%UM > Se recomand utilizarea calculatoarelor pentru activitile de fixare a noilor
cunotine i verificarea funcionrii programelor. Se va folosi i fereastra watch de
urmrire a valorii variabilelor n timpul execuiei programului.
Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi, avnd n vedere i elevii cu
nevoi speciale, pentru care se vor alege aplicatii mai accesibile, sau din contr cu un
nivel mai ridicat de dificultate..
Se vor alege ntrebri bine alese cu scopul clar de a diferenia tipurile de autoapeluri la
un nivel i de a contoriza numrul de autoapelri.
14
Ca materiale suport se pot folosi i lecii din biblioteca AEL cu reprezentri grafice ale
funcionrii stivei precum NetSuport School pentru prezentarea unor grafice ale
profesorului, respectiv elevilor.
Urmrirea raionamentului i a implementrii este punct de plecare pentru probele
de evaluare scrise sau practice.
e*a 28 Recur-i/itate ;i iterati/itate
Fi;a -uport 282 ipuri de al.orit*i de tra/er-are ;i in/er-are a unei -tructuri
Traversarea i inversarea unei structuri inseamn efectuarea unor operaii
oarecare asupra tuturor elementelor unei structuri n ordine direct, respectiv n ordine
invers. Variantele recursive snt 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_structura) atunci
traversare(element_urmator)
prelucrare(element);
}
funcie inversare (tip_element element)
{
daca( element <> ultimul_din_structura) atunci
traversare(element_urmator);
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.
15
E"emplu 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(n-1); scrie(n-1);}
E"emplul 2.
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). Funcia iterativ gasit(x,i) este definit
astfel.
gasit(x,i)=

an) a2,..., (a1, x daca , false


an) a2,..., (a1, x daca tre,
Se obsrev c funcia gasit are valoarea true fie dac elementul curent are valoarea x,
fie dac cel puin unul din elementele anterior testate are valoarea x. Funcia recursiv
poate fi definit n dou moduri:
(arianta 1- se evalueaz funcia gasit(x,n-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>>x;
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;}
16
(arianta 2- se evalueaz funcia gasit(x,0):
#include <iostream.h>
int a[100];
int gasit(int x, int i)
{if(i = = n-1) return x = = a[n-1];
else return ((x = = a[i]) || gasit(x,i+1));}
void main()
{int x,i,n;
cout<<n= ;
cin>>x;
cout<<x= ;
cin>>x;
for(i=0;i<n;i++)
{cout<<a[<<i<<]=;
cin>>a[i];}
if(gasit(x,0))
cout<<s-a gasit elementul<<x;
else cout<<nu s-a gasit elementul<<x;}
Varianta 3 pentru a se opri autoapelul dac deja s-a gsit un element cu valoarea
x , vom proceda astfel.
#include <iostream.h>
int a[100];
int gasit(int x, int i)
{if(i > n) return 0];
else return (x = = a[i]) return 1 ;
else return gasit(x,i+1);}
void main()
{int x,i,n;
cout<<n= ;
cin>>x;
cout<<x= ;
cin>>x;
for(i=0;i<n;i++)
{cout<<a[<<i<<]=;
cin>>a[i];}
if(gasit(x,0))
cout<<s-a gasit elementul<<x;
else cout<<nu s-a gasit elementul<<x;}
E"emplul 3.
S se verifice dac exist , ntr-un vector cu elemente intregi , cel puin un element
pozitiv.
Avem i aici trei variante ca i n exemplul 2, alegem spre prezentare varianta cea
mai eficient.
#include <iostream.h>
1!
int a[100],n;
int pozitiv(int i)
{if(i<=n) return 0;
else if (a[i]>0) return 1;
else return pozitiv(i+1);}
void main()
{int i;
count<<n= ;
cin>>n;
for(i=0;i<n;i++)
{cout<<a[<<i<<]=;
cin>>a[i];}
if(pozitiv(0))
cout<<s-a gasit cel putin un element pozitiv;
else cout<<nu s-a gasit nici un element pozitiv;}
E"emplul 4.
Se d un tablou bidimensional cu n linii i m coloane numere ntregi i se cere suma
elementelor pare din matrice.
#include <iostream.h>
int suma(int i, int j, int m, int a[][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], 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;}
Sugestii metodologice
18
U$DE > Coninutul poate fi predat n sala de clas, dar se recomand laboratorul de
informatic.
%UM > Se recomand utilizarea calculatoarelor pentru activitile de fixare a noilor
cunotine i verificarea funcionrii programelor. Se va folosi i fereastra watch de
urmrire a valorii variabilelor n timpul execuiei programului.
Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi, avnd n vedere i elevii cu
nevoi speciale, pentru care se vor alege aplicatii mai accesibile, sau din contr cu un
nivel mai ridicat de dificultate..
Se vor alege ntrebri bine alese cu scopul clar de a diferenia tipurile de
autoapeluri la un nivel i de a contoriza numrul de autoapelri.
Realizai o relaie bun cu elevii, mai ales cu cei care necesit nevoi speciale.
Stabilii de comun acord o strategie pentru ca elevul s poat face fa situaiei
respective .
Ca materiale suport se pot folosi i lecii din biblioteca AEL cu reprezentri grafice ale
funcionrii stivei precum i NetSuport School pentru prezentarea unor grafice ale
profesorului, respectiv elevilor.
Urmrirea raionamentului i a implementrii este punct de plecare pentru probele
de evaluare scrise sau practice.
.
19
e*a 28 Recur-i/itate ;i iterati/itate
Fi;a -uport 283 ipuri de al.orit*i de di/i:are8
Definiie
Tehnica divizarii ("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 s-ar putea scrie:
void rezolv(problema x){
if (x se imparte in subprobleme){
imparim pe x in pri x1,...,xk
re!ol"#(x1);
re!ol"#(x$);
}
else% }
E"emplul 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.
20
Se procedeaz astfel:
dac(i==j) maxim va fi v[i];
altfel se mparte vectorul in 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);
}
E"emplul 2.
Cutarea binar. 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 in caz afirmativ s se tipreasc indicele
componentei care conine acea valoare.
ndicaie: 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.
Problema nu se descompune in alte subprobleme ci se reduce la o subproblem.
#include <iostream.h>
int v[100],n,nr;
21
void caut(int i,int j)
{if (nr==v[(i+j)/2]
cout<<gasit<<' '<<indice "<<(i+j)/2;
else
if(i<j)
if (nr<v[(i+j)/2])
caut (,(i+j)/2-1);
else caut ((i+j)/2+1,j);
}}
void main()
{cout<<n=;
cin>>n;
for(int i=1;i<=n;i++)
{cout<<v["<<i<<];
cin>>v[i];}
cout<<nr=;
cin>>nr;
caut(1,n);}
Sugestii metodologice
U$DE > Coninutul poate fi predat n sala de clas, dar se recomand laboratorul de
informatic.
%UM > Se recomand utilizarea calculatoarelor pentru activitile de fixare a noilor
cunotine i verificarea funcionrii programelor. Se va folosi i fereastra watch de
urmrire a valorii variabilelor n timpul execuiei programului.
Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi, avnd n vedere i elevii cu
nevoi speciale, pentru care se vor alege aplicatii mai accesibile, sau din contr cu un
nivel mai ridicat de dificultate..
Pentru antrenarea elevilor cu nevoi speciale:
Folosii laudele ct de mult putei n ceea ce privete activitatea elevilor , atitudinea lor
i modul n care i-au mbuntit comportamentul ;gndii-v la anumite modaliti de
rsplat care i-ar putea motiva pe elevi .
Analizai curriculumul, modul n care acesta este predat i dac elevii l consider
interesant sau motivant. Folosii o varietate de activiti, inclusiv pentru cele care implic
utilizarea calculatorului. Deseori elevii se implic atunci cnd lucreaz cu programe
intractive i le face plcere cnd nva ceva nou..
Distribuii elevii n grupuri cu ali elevi care i vor motiva i sprijini.
Ca materiale suport se pot folosi lecii din biblioteca AEL cu reprezentri grafice ale
funcionrii stivei, precum i NetSuport School pentru prezentarea unor grafice ale
profesorului, respectiv elevilor.
Urmrirea raionamentului i a implementrii este punct de plecare pentru probele
de evaluare scrise sau practice.
22
e*a 28 Recur-i/itate ;i iterati/itate
Fi;a -uport 28? ipuri de al.orit*i recur-i/i cu re/enire
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 spatiul soluiilor posibile. n particular, Si
sunt identice avind 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
(daca mulimile Si ar avea numai cite 2 elemente, timpul ar fi proporional cu 2
n
).
Metoda backtracking urmrete evitarea generrii tuturor soluiilor posible. Elementele
vectorului x primesc valori pe rnd, lui xi i se atribuie valori, doar dac x
1
,x
2
,...,x
i-1
au
primit deja valori, valorile atribuite trebuind s verifice condiiile de continuitate
referitoare la x
1
,x
2
,...,x
i
. Doar apoi se trece la calculul lui x
i+1
. n cazul nendeplinirii
condiiilor de continuitate, se alege urmtoarea valoare posibil pentru x
i
. Dac Si a fost
epuizat, se micoreaz i, ncercnd o alt alegere pentru x
i-1
.
Pe acest metod se bazeaz rezolvarea unor probleme clasice ca: permutri de n,
"opt regine", partiii, a "relaiilor stabile", colorarea unei hrti, tierea unui fir de lungime l
n pri de lungimi date, etc.
Metoda backtracking poate fi implementat att iterativ ct i recursiv. .
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)
23
{int i;
for(i=1;i<=n;i++)
{st[p]=i;
if valid(p)
if(p==n)
tipar (p)
else back(p+1);
} }
E"emplul 1.
S se calculeze recursiv permutri de n, n natural citit de la tastatur.
#include <iostream.h>
#include <math.h>
int t[20],n;
void tipar()
{for(int i=1;i<=n;i++)
cout<<t[i];
cout<<endl;}
void perm(int k)
{int ,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);}
E"emplul 2.
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 inct s nu se atace.
Indicaie Metoda de rezolvare seaman cu rezolvarea permutrilor doar c n
condiia de validare se adaug condiia ca damele s nu se atace. Se poate folosi
urmatoarea procedur back:
void dame(int k)
{int ,j,corect;
if (k==n+1)tipar();
else {for(i=t[k]+1;i<=n;i++)
{ t[k]=i;
corect=1;
24
for(j=1;j<=k-1;j++)
if(t[j]==t[k] || abs(t[k]-t[j])==(k-j))
corect=0;
if (corect)dame(k+1);}}
t[k]=0;}
E"emplul 3.
Generarea partiiilor unui numr natural . Se citete n natural , s se tipreasc toate
modurile de descompunere a lui ca sum de n numere naturale.
#include <iostream.h>
#include <math.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);}
Sugestii metodologice
U$DE > Coninutul poate fi predat n sala de clasa, dar se recomand laboratorul de
informatic.
%UM > Se recomand utilizarea calculatoarelor pentru activitile de fixare a noilor
cunotine i verificarea funcionrii programelor. Se va folosi i fereastra watch de
urmrire a valorii variabilelor n timpul execuiei programului.
Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi, avnd n vedere i elevii cu
nevoi speciale, pentru care se vor alege aplicatii mai accesibile, sau din contr cu un
nivel mai ridicat de dificultate..
Se vor alege ntrebri bine alese cu scopul clar de a diferenia tipurile de
autoapeluri la un nivel i de a contoriza numrul de autoapelri.
Se va urmri evidenierea greelilor tipice n elaborarea algoritmilor.
Ca materiale suport se pot folosi i lecii din biblioteca AEL cu reprezentri grafice ale
funcionrii stivei precum NetSuport School pentru prezentarea unor grafice ale
profesorului, respectiv elevilor.
25
Urmrirea raionamentului i a implementrii este punct de plecare pentru probele
de evaluare scrise sau practice.
e*a 28 Recur-i/itate ;i iterati/itate
Fi;a -uport 28@ 'l.orit*i recur-i/i ;i iterati/i
#"iom
S-a demonstrat matematic c orice algoritm recursiv poate fi scris i iterativ, i reciproc.
Folosind fia suport 2.1 se vor rescrie algoritmii recursivi prezentai acolo, n mod
iterativ.
E"emplu 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. Pentru rezolvare, utilizm o definiie recursiv a celui
mai mare divizor comun pentru dou numere naturale a i b.
Cmmdc(a,b)=

<
>
=
b a a b a cmmdc
b a b b a cmmdc
b a a
), , (
), , (
,
#include <iostream.h>
void main()
{cout<<a=;
cin>>a;
cout<<b=;
cin>>b;
26
while(a!=b)
if(a>b)
a=a-b;
else b=b-a;
cout<<cmmdc=<<a;}
E"emplu 2.
Fie fib: N

N. S se calculeze fib(n), pentru n natural.


Fib(n)=

+
=
=
) 2 ( ) 1 (
1 , 1
0 , 1
n fib n fib
n
n
in rest
#include <iostream.h>
void main()
{int n,f0=1,f1=1,f2;
cout<<n=;
cin>>n;
if(!n) cout<<f0;
else if (n==1)
cout<<f1;
else
{for (int i=2;i<=n;i++)26
{f2=f0+f1;
f0=f1;
f1=f2;}
cout<<f2;}
E"emplu 3.
Calculul funciei Manna-Pnueli pentru un x intreg.:
F(x)=

< +
> =
12 ), 2 ( (
12 . , 1
x x F F
x x
#include <iostream.h>
int st[100],n,k;
main()
{cout<<n=;
cin>>n;
k=1;
st[1]=n;
while (k>0)
if(st[k]<12)
{k++;
st[k]=st[k-1]+2;}
else {k--;
2!
if(k>0)st[k]=st[k+1]-1;}
cout<<n=[1]-1;}
E"emplu 4.
Se d funcia lui Ackermann, definit mai jos. Se citesc numerele m i n naturale. S se
calculeze Ack(m,n).
Ack(m,n)=


=
= +
altfel n m Ack m Ack
n m Ack
m n
)), 1 , ( , 1 (
0 ), 1 , 1 (
0 , 1
#include <iostream.h>
int st[10000][2];
void main()
{int m,n,k;
cout<<m=; cin>>m;
cout<<n=; cin>>n;
k=1; st[k][0]=m; st[k][1]=n;
while(k>0)
if(st[k][0] && st[k][1])
{ k++;
st[k][0]=st[k-a][0];
st[k][1]=st[k-1][1]-1;
}else if(!st[k][1])
{ st[k][0]= st[k][0]-1;
st[k][1]=1;}
else k--;
if(k>0)
{ st[k][0]= st[k][0]-1;
st[k][1]= st[k+1][1]+1;}}
cout<<ac("<<','<<n<<)=<<st[1][1]+1;}
E"emplu 5.
S se calculeze recursiv suma cifrelor unui numr natural.
#include <iostream.h>
void main()
{int n,s=0;
cout<<n=;
cin>>n;
while(n)
{s+=n%10;
n/=10;}
cout<<s=<<s;}
Sugestii metodologice
28
U$DE > Coninutul poate fi predat n sala de clasa, dar se recomand laboratorul de
informatic.
%UM > Se recomand utilizarea calculatoarelor pentru activitile de fixare a noilor
cunotine i verificarea funcionrii programelor. Se va folosi i fereastra watch de
urmrire a valorii variabilelor n timpul execuiei programului.
Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi, avnd n vedere i elevii cu
nevoi speciale, pentru care se vor alege aplicatii mai accesibile, sau din contr cu un
nivel mai ridicat de dificultate..
Se vor alege ntrebri bine alese cu scopul clar de a diferenia tipurile de autoapeluri la
un nivel i de a contoriza numrul de autoapelri.
Se va urmri:
testarea i analizarea comportamentului programelor pentru diferite date de
intrare;
ncurajarea discuiilor purtate ntre elevi, exprimarea i ascultarea prerilor
fiecruia.
Ca materiale suport se pot folosi i lecii din biblioteca AEL cu reprezentri grafice ale
funcionrii stivei precum NetSuport School pentru prezentarea unor grafice ale
profesorului, respectiv elevilor.
Urmrirea raionamentului i a implementrii este punct de plecare pentru probele
de evaluare scrise sau practice.
e*a 38 '/antaAele ;i de:a/antaAele utili:,rii recur-i/it,ii
Fi;a -uport 381 Eli*inarea recur-i/it,ii
Definiie
Orice program recursiv poate fi transformat n unul iterativ, s-a demonstrat matematic
acest lucru.
Algoritmul iterativ poate deveni ns, mai complicat i mai greu de neles. De multe ori,
soluia unei probleme poate fi elaborat mult mai uor, mai clar i mai simplu de
verificat, printr-un algoritm recursiv. Pentru implementare, poate fi necesar
transformarea algoritmului recursiv n unul nerecursiv, n situaiile: soluia problemei
trebuie scris ntr-un limbaj nerecursiv; un caz particular sunt compilatoarele ce "traduc"
un program recursiv dintr-un limbaj de nivel inalt n cod main (nerecursiv) varianta
recursiv ar duce la o vitez de execuie i spaiu de memorie prea mari, transformarea
n una nerecursiv, eliminnd dezavantajele. Se va prezenta 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. Recursivitatea implic folosirea cel puin a unei stive. La fiecare apel
recursiv sunt depuse in stiv date, care sunt extrase la revenirea din acel apel. E simplu
dac datele pentru un apel se organizeaz ntr-o structur, un apel nsemnnd
introducerea in stiv a unei structuri, revenirea, extragerea structurii.
29
1, n"0
#(n) " 1, n"1
#(n$1)%#(n$2), n&"2
E"emplu 1
S comparm n continuare soluia recursiv i cea iterativ pentru o problem celebr:
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 8 ...
Nr. perechi 1 1 2 3 5 8 1
3
2
1
3
4
...
Notm cu U(n) numrul perechilor din luna n Atunci avem:
Acest ir este chiar irul lui Fibonacci.
Algoritmul recursiv decurge astfel: pentru calculul lui fib(n) sunt calculai fib(n-1) i fib(n-
2), ai cror parametri sunt depui pe stiv. De exemplu, pentru a calcula fib(10) se
calculeaz fib(9) i fib(8); fib(9) ca sum de fib(8) i fib(7), dup care se calculeaz
fib(8) nc o dat. S ne imaginm, pentru fib(800), de cte ori se calculeaz fib(3) !
Deoarece metoda implic determinarea, cu salvrile pe stiv aferente, a acelorai valori
n mod repetat, este de preferat, evident, varianta iterativ, mult mai natural n aceast
situaie.
Din aplicaile prezentate in 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.
E"emplu 2
Se consider irurile definite recurent astel:
A0=a; b0=b; a,b>0:
1 1
1 1
,
2


=
+
=
n n n
n n
n
b a b
b a
a
S se scrie un program care s citeasc a,b i n i s se calculeze an i bn.
30
#include <iostream.h>
#include <math.h>
double a,b;
int n;
double bn(int n);
double an(int n)
{if (!n)return a;
else return (an(n-1)+bn(n-1))/2;}
double bn(int n)
{if (!n) return b;
else return sqrt(an(n-1)*bn(n-1));
}
void main()
{cout<<a=;
cin>>a;
cout<<b=;
cin>>b;
cout<<n;
cin>>n;
cout<<an(n)<<' '<<bn(n);}
Totui , fiecare apel al unui suprogram recursiv inseamn nc o zon de memorie
rezervat pentru execuia subprogramului ( variabilele locale i instruciunile). Pentru o
adncime mare a recursivitii, algoritmii recursivi nu mai sunt eficieni deoarece timpul
de execuie crete din cauza timpilor necesari pentru mecanismul de apel i pentru
administrarea stivei de sistem. Apare posibilitatea unei erori datorit depirii memoriei
alocate de compilator pentru stiv.
Vezi funcia Ackermann pentru valori mici i funcia Fibonacci pentru valori ale lui n
foarte mari.
Este indicat s se argumenteze bine care metod este aleas pentru rezolvarea
unei probleme.
Sugestii metodologice
U$DE >
Locul de desfurare a instruirii se recomand a fi un laborator de informatic n care -
pentru optimizarea demersului didactic - este necesar s existe o dotare minimal care
presupune un numr de calculatoare egal cu numrul elevilor din clas, conectate n
reea i cu acces la toate serviciile NTERNET. Configuraia calculatoarelor trebuie s
permit rularea aplicaiilor prin care vor fi formate competenele specifice.
%UM > Se recomand utilizarea calculatoarelor pentru activitile de fixare a noilor
cunotine i verificarea funcionrii programelor. Se va folosi i fereastra watch de
urmrire a valorii variabilelor n timpul execuiei programului.
31
n strategia didactic propunem folosirea metodelor active de nvare, cum sunt:
explicaia n etapa de comunicare; nvarea prin descoperire dirijat, inductiv,
experimental; conversaia de consolidare n etapa de fixare a cunotintelor,
problematizarea.
discuii despre activiti cotidiene i modelarea acestora sub forma unei secvene
bine definite de pai;
citirea atent a enunului unei probleme;
combinarea unor prelucrri elementare pentru obinerea anumitor prelucrri
complexe n funcie de scopul propus;
explicarea conceptelor referitoare la subprograme recursive;
descompunerea rezolvrii unei probleme n subprobleme;
identificarea unor situaii n care alegerea unui algoritm prezint avantaje n
raport cu altul;
exersarea crerii i aplicrii programelor pentru rezolvarea unor probleme
ntlnite de elevi n studiul altor discipline colare;
Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi, avnd n vedere i elevii cu
nevoi speciale, pentru care se vor alege aplicatii mai accesibile, sau din contr cu un
nivel mai ridicat de dificultate..
Ca materiale suport se pot folosi i lecii din biblioteca AEL cu reprezentri grafice ale
funcionrii stivei precum NetSuport School pentru prezentarea unor grafice ale
profesorului, respectiv elevilor.
Urmrirea raionamentului i a implementrii este punct de plecare pentru probele
de evaluare scrise sau practice.
32
e*a ?8 e9nica de pro.ra*are B Di/ide et "*peraC
Fi;a -uport ?81 De-criere .eneral,
)ivide et impera este o tehnic special prin care se pot rezolva anumite probleme.
Expresia provine din latin unde exista i este celebr: *)ivide et impera+ . n romn
este mai cunoscut ca: Dde:<in, ;i -t,pEne;teC. Expresia este atribuit lui Filip al -lea,
rege al Macedoniei (382-336 .C.), descriind politica sa mpotriva oraelor-state
greceti.
)ivide et Impera, ca tehnic de programare, se bazeaz pe un principiu asemnator
celui din viaa politic i social, scopul fiind ns total diferit.

Tehnica " )ivide et Impera const n dou etape:
)ivide. 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.
33
Re-tricii
Metoda )ivide $t Impera se poate aplica n rezolvarea unei probleme care ndeplinete
urmtoarele condiii :
- se poate descompune n ( dou sau mai multe) suprobleme ;
- 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.
Evident nu toate problemele pot fi rezolvate prin utilizarea acestei tehnici. Fr team
de a grei, putem afirma c numrul lor 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.
Sc9e*a .eneral,
Metoda )ivide $t Impera admite o implementare recursiv, deorece 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
metodei )ivite $t 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 in dou sau mai multe subprobleme i pentru fiecare din ele se
continu apelurile recursive (ale procedurii sau funciei).
n etapa final a metodei )ivide $t Impera se produce combinarea subproblemelor
(rezolvate deja) prin secvenele de revenire din apelurile recursive.
Etapele metodei )ivide $t Impera- prezentate anterior, se pot reprezenta prin urmtorul
subprogram general recursiv exprimat n limbaj natural:
Subprogram DVMP (X);
Dac PROBLEMA X este simpl
Atunci se rezolv i se obine soluia SOL
34
Altfel pentru i=1,k execut DVMP(X) i se obine SOL1;
Sf _dac
Se combina soluiile SOL 1,... ,SOL K i se obine SOL;
Sf _subprogram;
Deci, subprogramul DVMP se apeleaz pentru problema iniial X; aceasta admite
descompunerea n K subprobleme simple; pentru acestea se reapeleaz recursiv
subprogramul; n final se combin soluiile acestor K subprobleme.
"dentificarea di*en-iunii -u<pro<le*elor
n general un subprogram )ivide $t Impera se aplic unui tablou (vector) V = <v
1
,...,v
n
>
(V[1..n], n=dim[V]), asupra cruia vrem sa aplicm o operaie oarecare (sortare,
determinarea valorii maxime, determinarea cmmdc, etc).
Identificarea *odalit,ii de *p,rire n -u<pro<le*e
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).
Re:ol/area -u<pro<le*elor
Se rezolv subproblema direct8
%o*<inarea -oluiilor
Dup rezolvarea celor dou subprobleme se execut faza de combinare a rezultatelor
n vederea rezolvrii ntregii probleme. Se face prin interclasarea soluiilor.
Su<pro.ra*ul di/ide
Subprogram Divmp(V,p,q)
Daca q-p <= 1 atunci Rezolva(V,p,q)
altfel m=(p+q) div 2
Divmp(V,p,m)
Divmp(V,m+1,q)
Combina(V,p,m,q)
Sf_Daca
Sf_subprogram.
'pelul -u<pro.ra*ului
niial p=1, q=n, rezult Divmp(V,1,n).
Su.e-tii *etodolo.ice
U$DE > Coninutul poate fi predat n sala de clas sau n laboratorul de informatic.
%UM > Se recomand utilizarea unui videoproiector pentru o mai buna vizualizare i
implicit nelegere a noilor cunotine..
35
Clasa poate fi organizat frontal, avnd n vedere i elevii cu nevoi speciale, pentru
care se vor alege exemple ct mai accesibile, sau din contr cu un nivel mai ridicat de
dificultate.
Se vor alege ntrebri bine fixate cu scopul clar de a identifica modul de mprire n
subprobleme i de a identifica modaliti de combinare a rezultatelor subproblemelor.
Ca materiale suport se va folosi i fia suport 2.4 de la tema 2.
Urmrirea raionamentului i a implementrii este punct de plecare pentru probele
de evaluare scrise sau practice. Se vor alege i probleme de verificare a gestionrii
stivei pentru acest tip de problem.
e*a @8 e9nica de pro.ra*are 4acFtracFin.
Fi;a -uport @81 De-crierea te9nicii
Aceast tehnic se folosete n rezolvarea problemelor care ndeplinesc simultan
urmtoarele condiii:
- soluia lor poate fi pus sub forma unui vector S= x
1
x
2
., x
n
cu x
1

A
1,
x
2

A
2
X
n

A
n
;
- mulimile A
1
, A
2
, .., A
n
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
- x
1
x
2
., x
n
pot fi la rndul lor vectori;
- A
1
, A
2
., A
n
pot coincide.
Tehnica ,ac-trac-ing are la baz un principiu extrem de simplu:
- se construiete soluia pas cu pas: x
1
, x
2


.,x
n
- 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.
36
Concret
- se alege primul element x, ce aparine lui A;
- presupunnd generate elementele x
1
,x
2


.,x
k
, aparinnd mulimilor A
1
, A
2
.,A
k
se alege (dac exist) x
k+1
, primul element disponibil din mulimea A
k+1
, apar dou
posibiliti :
1) Nu s-a gsit un astfel de element, caz n care caz n care se reia cutarea
considernd generate elementele x
1
,x
2


.,x
k-1
, iar aceasta se reia de la urmtorul
element al mulimii A
k
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 x
1
,x
2


.,x
k
, (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 x
1
,x
2


.,x
k
, i se caut un prim element x
k+1
din

A
k+1
.
- nu le ndeplinete, caz n care se reia algoritmul considernd generate
elementele x
1
,x
2


.,x
k
, iar elementul x
k+1
se caut ntre elementele mulimii A
k+1
, rmase
netestate.
Algoritmii se termin atunci cnd nu exist nici un element x
1
din A
1
netestat.
$%servaie: tehnica ,ac-trac-ing are ca rezultat obinerea tuturor soluiilor problemei.
n cazul n care se cere o singur 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
din A
1
, se va gsi pe primul nivel al
stivei, x
2
din A
2
se va gsi pe al doilea nivel al stivei,... x
k
din A
k
se va gsi pe nivelul k al
stivei. n acest fel, stiva (notat ST) va arta astfel:
ST
Nivelul k+1 al stivei trebuie iniializat (pentru a alege, n ordine,
elementele mulimii k+1 ). niializarea trebuie fcut cu o valoare
aflat (n relaia de ordine considerat, pentru mulimea A
k+1
) naintea
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. niializarea unui nivel
(oarecare) se face cu valoarea 0. Funcia de iniializare o vom numi "nitGH8
Gsirea urmtorului element al mulimii A
k
(element care a fost netestat) se face cu
ajutorul funciei '*ISuceee-orGH. AS este o variabil boolean. n situaia n care am
3!
...
x
'
(
(
x
2
x
1
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 EI3alidGH8
Testul dac s-a ajuns sau nu la soluia final se face cu ajutorul funciei SolutieGH iar o
soluie se tiprete cu ajutorul funciei iparGH. Prezentm n continuare rutina &ac'():
void back () {
int AS;
k=1;
nit();
while (k>0)
{
do {} while ((AS=Am_Suceeesor()) && !E_Valid());
if (AS)
if (Solutie()) Tipar();
else {k++; nit();}
else k--;
}
}
$%servaie Problemele rezolvate prin aceast metod necesit un timp ndelungat.
Din acest motiv, este bine s utilizm metoda numai atunci cnd nu avem la dispoziie
un alt algoritm mai eficient. Cu toate c exist probleme pentru care nu se pot elabora
ali algoritmi mai eficieni, tehnica %ac'trac'ing trebuie aplicat numai n ultim
instan.
E"emplu+
Fiind dat o tabl de ah, de dimensiune n, x
n
, se cer toate soluiile de aranjare a n
dame, astfel nct s nu se afle dou dame pe aceeai linie, coloan sau diagonal
(dame s nu se atace reciproc).
Presupunnd c dispunem de o tabl de dimensiune 4x4, o soluie ar fi urmtoarea:
Observm c o dam trebuie s fie plasat singur pe linie. Plasm prima dam pe
linia 1, coloana 1.
38
D
D
D
D
D
A doua dam nu poate fi aezat dect n coloana 3.
Observm c a treia dam nu poate fi plasat n linia 3. ncercm atunci plasarea celei
de-a doua dame n coloana 4.
A treia dam nu poate fi plasat dect n coloana 2.
n aceast situaie dama a patra nu mai poate fi aezat.
ncercnd s avansm cu dama a treia, observm c nu este posibil s o plasm nici n
coloana 3, nici n coloana 4, deci o vom scoate de pe tabl. Dama a doua nu mai poate
avansa, deci i ea este scoas de pe tabl. Avansm cu prima dam n coloana 2.
39
D
D
D
D
D
D
D
A doua dam nu poate fi aezat dect n coloana 4.
Dama a treia se aeaz n prima coloan.
Acum este posibil s plasm a patra dam n coloana 3 si astfel am obinut o soluie a
problemei.
Algoritmul continu n acest mod pn cnd trebuie scoas de pe tabl prima dam.
Pentru reprezentarea unei soluii putem folosi un vector cu n componente (avnd n
vedere c pe fiecare linie se gsete o singur dam).
Exemplu pentru soluia gsit avem vectorul ST ce poate fi asimilat unei stive.
Dou dame se gsesc pe aceeai diagonal dac i numai dac este ndeplinit
condiia: |st(i)-st(j)|=|i-j| ( diferena, n modul, ntre linii si coloane este aceeai).
40
D
D
D
D
D
D
D
D
D
D
ST(4)
ST(3) n general ST(i)=k semnific faptul c pe linia i dama ocup poziia k.
ST(2)
ST(1)
Astfel n tabla 4 x4 avem situaia:
st(1)= 1 i = 1
st(3)= 3 j = 3
|st(1) - st(3)| = |1 3| = 2
|i j| = |1 3| = 2
sau situaia
st(1) = 3 i = 1
st(3) = 1 j = 3
|st(i) - st(j)| = |3 1| = 2
|i j| = |1 3| = 2
ntruct dou dame nu se pot gsi n aceeai coloan, rezult c o soluie este sub
form de permutare. O prim idee ne conduce la generarea tuturor permutrilor i la
extragerea soluiilor pentru problema ca dou dame s nu fie plasate n aceeai
diagonal. A proceda astfel, nseamn c lucrm conform strategiei %ac'trac'ing.
Aceasta presupune c imediat ce am gsit dou dame care se atac, s relum
cutarea.
lat algoritmul, conform strategiei generate de %ac'trac'ing:
- n prima poziie a stivei se ncarc valoarea 1, cu semnificaia c n linia unu se
aeaz prima dam n coloan.
- Linia 2 se ncearc aezarea damei n coloana 1, acest lucru nefiind posibil
ntruct avem doua dame pe aceeai coloan.
- n linia 2 se ncearc aezarea damei n coloana 2 , ns acest lucru nu este
posibil, pentru c damele se gsesc pe aceiai diagonal (|st(1)-st(2)|=|1-2|);
- Aezarea damei 2 n coloana 3 este posibil.
- Nu se poate plasa dama 3 n coloana 1, ntruct n liniile 1-3 damele ocupa
acelai coloan.
- Si aceast ncercare eueaz ntruct damele de pe 2 i 3 sunt pe aceeai
diagonal.
- Damele de pe 2-3 se gsesc pe aceeai coloan.
- Damele de pe 2-3 se gsesc pe aceeai diagonal.
- Am cobort n stiv mutnd dama de pe linia 2 i coloana 3 n coloana 4.
41
D
D
D
D
D
D
D
D
3
1
4
2
Algoritmul se ncheie atunci cnd stiva este vid.
#include<iostream.h>
#include<math.h>
int st[100],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[k]==st[i] || abs(st[k]-st[i])==abs(k-1) ) 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;
nit();
While(k>0)
{
do{}while((AS=Am_Succesor()) && !E_Valid());
if(AS)
if (Solutie())Tipar();
else{k++;nit();}
else k--;
}
}
main()
{ cout<<"n=";cin>>n;
back();
}
Sugestii metodologice
42
U$DE >
Locul de desfurare a instruirii se recomand a fi un laborator de informatic n care -
pentru optimizarea demersului didactic - este necesar s existe o dotare minimal care
presupune un numr de calculatoare egal cu numrul elevilor din clas, conectate n
reea i cu acces la toate serviciile NTERNET. Configuraia calculatoarelor trebuie s
permit rularea aplicaiilor prin care vor fi formate competenele specifice.
%UM > Se recomand utilizarea calculatoarelor pentru activitile de fixare a noilor
cunotine i verificarea funcionrii programelor. Se va folosi i fereastra watch de
urmrire a valorii variabilelor n timpul execuiei programului.
n strategia didactic propunem folosirea metodelor active de nvare, cum sunt:
explicaia n etapa de comunicare; nvarea prin descoperire dirijat, inductiv,
experimental; conversaia de consolidare n etapa de fixare a cunotintelor,
problematizarea.
discuii despre activiti cotidiene i modelarea acestora sub forma unei secvene
bine definite de pai;
citirea atent a enunului unei probleme;
combinarea unor prelucrri elementare pentru obinerea anumitor prelucrri
complexe n funcie de scopul propus;
explicarea conceptelor referitoare la subprograme recursive;
descompunerea rezolvrii unei probleme n subprobleme;
identificarea unor situaii n care alegerea unui algoritm prezint avantaje n
raport cu altul;
exersarea crerii i aplicrii programelor pentru rezolvarea unor probleme
ntlnite de elevi n studiul altor discipline colare;
Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi, avnd n vedere i elevii cu
nevoi speciale, pentru care se vor alege aplicatii mai accesibile, sau din contr cu un
nivel mai ridicat de dificultate..
Ca materiale suport se pot folosi i lecii din biblioteca AEL cu reprezentri grafice ale
funcionrii stivei precum NetSuport School pentru prezentarea unor grafice ale
profesorului, respectiv elevilor.
Urmrirea raionamentului i a implementrii este punct de plecare pentru probele
de evaluare scrise sau practice.
43
e*a @8 e9nica de pro.ra*are4acFtracFin.
Fi;a -uport @82 4acFtracFin. recur-i/
n fia suport 5.1 am prezentat tehnica Backtracking clasic, nerecursiv, iar n fia suport
5.2 prezentm varianta recursiv a acestei tehnici.
n acest caz 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 <v
1
> la <v
n
> execut
nceput
st[k]contor
44
dac valid(k) atunci dac<soluia este final> atunci apel tipar
altfel auto-apel back_recursiv(k+1)
sfrit
ntrun ciclu, prin variabila contor vor trece pe rnd toate valorile din intervalul <v
1
> la
<v
n
> 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 la
capt, dar cu k+1 n loc de k.

E=e*plu 18 Problema damelor de ah.
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.
ntruct pe o linie se gsete o singur dam, soluia se prezint sub form de vector
x =(x
1
, x
2
, ... ,x
n
), unde x
i
reprezint coloana pe care se afl dama n linia i.
Condiiile de continuare sunt:
a) dou dame nu se pot afla pe aceeai coloan, adic:
)) dou dame nu se pot afla pe aceeai diagonal, adic:
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++)
45
[ ] [ ] * + , -entr + . , . > < > <
[ ] [ ] 1. $ ' ... 2, 1, , -entr , . ' . , $ ' = > <
{
x[k]=j;
if(valid(k)==1)
if(k<n) back_recursiv(k+1);
else {
/*tiprirea soluiei */
nr_solutie++;
cout<<"\nSOLUTA 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(void)
{
cout<<"\nOrdinul tablei de sah n=";
cin>>n;
nr_solutie=0;
back_recursiv(1);
cout<<"\nSFARST\n";
}
Se observ c tiprirea unei soluii se face chiar n interiorul funciei recursive. Apelul
funciei back_recursiv se face n funcia principal main() prin apelul back_recursiv(1).
E=e*plu 28 Problema permutrilor
Se citete un numr natural n. S se genereze toate permutrile mulimii {1,2,.,n}.
Generarea permutrilor se va face innd cont c orice permutare va fii alctuit din
elemente distincte ale mulimii A={1,2,..,n}.
#include<conio.h>
#include<iostream.h>
int st[21],n;
void init()
{int i;
cout<<"n=";
cin>>n;
for(i=1;i<=n;i++)
st[i]=0;
}
void tipar(int k)
{ int i;
for (i=1;i<=k;i++)
cout<<st[i];
cout<<endl;
}
46
int valid(int k)
{ int i,ok;
ok=1;
for(i=1;i<k;i++)
if (st[i]==st[k]) ok=0;
return ok;
}
void back(int k)
{ int i;
for(i=1;i<=n;i++)
{ st[k]=i;
if (valid(k)) if(k==n) tipar(k);
else back(k+1);
}
}
main()
{ init();
back(1);
getch();
}
E"emplul 3: Generarea aranjamentelor:
Se citesc n i p. S se genereze toate aranjamentele de n luate cte p
#include<conio.h>
#include<iostream.h>
int st[21],n,p
void init()
{int i;
cout<<"n=";
cin>>n;
cout<<"p=";
cin>>p;
for(i=1;i<=n;i++)
st[i]=0;
}
void tipar(int k)
{ int i;
for (i=1;i<=k;i++)
cout<<st[i];
cout<<endl;
}
int valid(int k)
{ int i,ok;
ok=1;
for(i=1;i<k;i++)
if (st[i]==st[k]) ok=0;
return ok;
}
void back(int k)
{ int i;
for(i=1;i<=n;i++)
4!
{ st[k]=i;
if (valid(k)) if(k==p) tipar(k);
else back(k+1);
}
}
main()
{ init();
back(1);
getch();
}
Sugestii metodologice
U$DE > Coninutul poate fi predat n sala de clasa, dar se recomand laboratorul de
informatic.
%UM > Se recomand utilizarea calculatoarelor pentru activitile de fixare a noilor
cunotine i verificarea funcionrii programelor. Se va folosi i fereastra watch de
urmrire a valorii variabilelor n timpul execuiei programului.
Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi, avnd n vedere i elevii cu
nevoi speciale, pentru care se vor alege aplicaii mai accesibile, sau din contr cu un
nivel mai ridicat de dificultate..
Se vor alege ntrebri bine alese cu scopul clar de a diferenia mecanismul de
backtracking clasic de cel recursiv.
Se va urmri:
testarea i analizarea comportamentului programelor pentru diferite date de
intrare;
ncurajarea discuiilor purtate ntre elevi, exprimarea i ascultarea prerilor
fiecruia.
se vor ncuraja elevii s identifice tipul de problem prezentat.
se vor ncuraja elevii s creeze ei nii probleme pe tipurile date.
Ca materiale suport se pot folosi i lecii din biblioteca AEL cu reprezentri grafice ale
funcionrii stivei la aplicaiile de backtracking recursiv,precum NetSuport School pentru
prezentarea unor programe ale profesorului, respectiv elevilor.
Urmrirea raionamentului i a implementrii este punct de plecare pentru probele
de evaluare scrise sau practice, precum i testarea programelor pentru valori diferite ale
datelor de intrare.
48
49
e*a J8 e9nica de pro.ra*are (reedK
Fi;a -uport J81 De-crierea te9nicii
Dei este practic imposibil s fie dat forma general, a unei probleme rezolvabile cu
tehnica Greedy, ncercm totui.
Re-tricii
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.
................................................................................................................
Algoritmul se ncheie cnd au fost alese i eventual adugate toate elementele
mulimii.
Sc9e*a .eneral, (reedK
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.
ntuitiv, alegem un element, al doilea,...pn cnd obinem ce dorim sau pn cnd au
fost testate toate elementele mulimii. De aici provine i numele metodei greedy
(lacom).
Greedy pare att de simpl nct, la nceput, ne mir faptul c a fost evideniat ca
tehnic. La o analiz atent, vom observa c lucrurile nu stau chiar aa. Exemplul
prezentat este didactic (l rezolvm i fr s tim c exist aceast tehnic), el nu are
alt rol dect de a evidenia caracteristicile tehnicii.
Definiie
Tehnica Greedy poate fi privit ca o particularizare a tehnicii Backtracking, n care se
renun la mecanismul de ntoarcere.
S analizm, n paralel, cele dou tehnici, pentru a putea stabili asemnrile i
diferenele existente ntre ele:
50
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
%on-ecina 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, dupa ce se
indentific 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.
%on-ecina 2.
Tehnica Greedy conduce la timp de calcul polinomial.
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(n
2
).
Selectarea ele*entelor ce for*ea:, -oluia
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
2
n). ns sortarea se
efectueaz la nceput. Prin urmare, acest timp se adun, deci nu influeneaz rezultatul.
O ntrebare fireasc: fiind dat o problem, exist ntotdeauna un algoritm de tip greedy
care gsete soluia optim?Evident, nu. Exist probleme pentru care nu se cunosc
astfel de algoritmi.Mai mult, pentru cele mai multe probleme, nu se cunosc algoritmi
Greedy.
(enerarea ;i afi;area -oluiei.
Deoarece soluia problemelor ce se rezolv cu acest tehnic este sub form de vector,
acesta se completeaz pas cu pas i apoi se afieaz.
'/antaAul te9nicii
Avantajul timpului polinomial, conduce la necesitatea utilizrii tehnicii Greedy. Din alt
punct de vedere, nu tuturor problemelor li se pot aplica algoritmi de acest tip. Ce este
de fcut?
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.
Astfel de algoritmi se numesc algoritmi euristici.
Pro<le*e pentru care (reedK o<ine -oluia opti*,
E"emplul 18 Problema spectacolelor
51
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.
Rezolvare
Fie o planificare optim a spectacolelor (un numr maxim k de spectacole i
1
,i
2
,...i
k
, unde
i
1
,i
2
,...i
k
c {1,2,..n} i spectacolul i
j
are lor naintea spectacolului i
j+1
).O astfel de
planificare ndeplinete condiia: spectacolul i
j+1
ncepe dup terminarea spectacolului i
j
.
O consecin imediat a condiiei de mai sus este: spectacolul i
j
ia sfrit naintea
terminrii spectacolului i
j+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 de a alege
un spectacol (cu ora de terminare mai mare dect ora de terminare a ultimului spectacol
programat iar dac este posibil (dac are ora de nceput dup ora de sfrit a ultimului
spectacol programat) este adugat soluiei.Odat adugat (programat) un spectacol,
acesta rmne n cadrul soluiei.
#include<iostream.h>
int s[2][10],o[10],n,,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[i][o[i+1])
{ m=o[i] ; o[i]=o[i+1]; o[i+1]=m;
gata=0;
}
while (!gata);
}

main()
{cout<<n=;cin>>n;
for(i=1;i<=n;i++)
{o[i]=;
cout<<ora de inceput pentru spectacol "<<i<< (hh mm)=;
cin>>h1>>m1;
s[0][i]=h1*60+m1;
cout<<ora de sfarsit pentru specatcol "<<i<< (hh mm)=;
cin>>h2>>m2;
52
s[1][i]=h2*60+m2;
}
sortare();
cout<<ordinea spectacolelor este<<endl<<o[i]<<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]];}
}
}
E"emplul 2. Problema rucsacului
O persoan are un rucsac cu care poate transporta o greutate maxim G. Persoana are
la dispoziie n obiecte si cunoate pentru fiecare obiect greutatea si 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.
O precizare n plus transform aceast problem n alte dou probleme distincte.
Aceast precizare se refer la faptul c obiectele pot fi sau nu tiate pentru transportul
la destinaie. n prima situaie, problema poart numele de pro'lema continu a
rucsacului, iar n a doua avem pro'lema discreta a rucsacului Aceste dou probleme
se rezolv diferit Varianta continu a problemei rucsacului este rezolvat mai jos, iar
cea discret se rezolv cu ajutorul programrii dinamice.
Pro'lema continu a rucsacului, n care persoana are posi'ilitatea s taie o'iectele n
acest fel, se poate obine o ncrcare mai eficient a rucsacului.
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 si 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 si nu au fost
luate in 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.
Vom considera un exemplu numeric.
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.
53
Eficiena de transport este 1 pentru primul obiect, 4 pentru al doilea si 2 pentru al
treilea.
n concluzie, obiectul 2 se ncarc n ntregime n rucsac, obinnd un ctig de 4 i
rmne o capacitate de transport de dou uniti de greutate.
Se ncarc 2/3 din obiectul 3 (care este al doilea n ordinea eficienei de transport)
pentru care se obine ctigul 4. Ctigul obinut n total este 8. Se remarca strategia
GREEDY prin alegerea obiectului care va fi transportat, alegere asupra creia nu se
revine.
#include<iostream.h>
double c[9],g[9],ef[9],gv,man,castig;
int n,i,man1,inv,ordine[9];
main()
{cout<<greutatea ";
cin>>gv;
cout<<numar obiecte ";
cin>>n;
for(i=1;i<=n;i++)
{cout<<c["<<i<<]=;
cin>>c[i];
cout<<g["<<i<<]=;
cin>>g[i];
ordine[i]=;
ef[i]=c[i]/g[i];
}
do
{ inv=0;
for(i=1;i<=n-1;i++)
if(ef[i]<ef[i+1])
{man=ef[i]; ef[i]=ef[i+1]; ef[i+1]=man;
man=c[i]; c[i]=c[i+1]; c[i+1]=man;
man=g[i]; g[i]=g[i+1]; g[i+1]=man;
inv=1;
man1=ordine[i]; ordine[i]=ordine[i+1]; ordine[i+1]=man1;}
}while (inv);
i=1;
while (gv>0 && i<=n)
{ if (gv>g[i])
{cout<< obiectul "<<ordine[i]<< "<<i<<endl;
gv-=gv[i];
castig=castig+c[i];
} else
{cout<<obiectul "<<ordine[i]<< " "<<gv/g[i]<<endl;
castig=castig+c[i]*gv/g[i];
gv=0;
}
i++;
}
cout<<castig total "<<castig;
54
}
Sugestii metodologice
U$DE > Coninutul poate fi predat n sala de clasa cu ajutorul unui videoproiector, dar
se recomand laboratorul de informatic.
%UM > Se recomand utilizarea calculatoarelor pentru buna deprindere a noilor
cunotine i verificarea funcionrii programelor. Se va folosi i fereastra watch de
urmrire a valorii variabilelor n timpul execuiei programului.
Clasa poate fi organizat frontal sau pe grupe de 3-4 elevi, avnd n vedere i elevii cu
nevoi speciale, pentru care se vor alege aplicaii mai accesibile, sau din contr cu un
nivel mai ridicat de dificultate..
Se vor alege ntrebri bine alese cu scopul clar de a diferenia mecanismul de urcare i
coborre n stiv cu toate elementele mulimii de succesori..
Se va urmri:
testarea i analizarea comportamentului programelor pentru diferite date de
intrare;
ncurajarea discuiilor purtate ntre elevi, exprimarea i ascultarea prerilor
fiecruia.
nsuirea restriciilor pentru tehnica Greedy.
ntocmirea de proiecte pe echipe de 4+6 elevi.
Este recomandabil ca or.ani:area demersului didactic corespunztor unit,ii de
n/,are s in cont de parcurgerea a trei secvene, ce pot fi descrise sintetic prin:
familiarizare;
structurare;
aplicare.
Ca materiale suport se pot folosi i lecii din biblioteca AEL sau a tablelor inteligente,
daca exist n dotare.Se va folosi NetSuport School pentru prezentarea unor programe
ale profesorului, respectiv elevilor.
Urmrirea raionamentului i a implementrii este punct de plecare pentru probele
de evaluare scrise sau practice, precum i testarea programelor pentru valori diferite ale
datelor de intrare. Se va urm[ri ca probele de evaluare s aib i funcia de dezvoltare a
capacitilor elevului.
55
"38 Fi;a re:u*at
$u*ele ele/ului: _________________________
$u*ele profe-orului+ /////////////////////////
%o*petene
care tre<uie
do<Endite
'cti/it,i efectuate ;i
co*entarii
Data
acti/itatii
E/aluare
4ine
Sati--
f,c,tor
Refacere
Comp 1
0"ici se
trece
numele
compe1
tentei2
Activitate 1
Activitate2
%o*entarii Priorit,i de de:/oltare
%o*petene care ur*ea:, -, fie
do<Endite Gpentru fi;a ur*,toareH
Re-ur-e nece-are
56
%o*petene care tre<uie do<Endite
Aceast fi de nregistrare este fcut pentru a evalua, n mod separat, evoluia
legat de diferite competene. Acest lucru nseamn specificarea competenelor tehnice
generale i competenelor pentru abiliti cheie, care trebuie dezvoltate i evaluate.
Profesorul poate utiliza fiele de lucru prezentate n auxiliar i/sau poate elabora alte
lucrri n conformitate cu criteriile de performan ale competenei vizate i de
specializarea clasei.
'cti/it,i efectuate ;i co*entarii
Aici ar trebui s se poat nregistra tipurile de activiti efectuate de elev,
materialele utilizate i orice alte comentarii suplimentare care ar putea fi relevante
pentru planificare sau feed-back.
Priorit,i pentru de:/oltare
Partea inferioar a fiei este conceput pentru a meniona activitile pe care
elevul trebuie s le efectueze n perioada urmtoare ca parte a viitoarelor module.
Aceste informaii ar trebui s permit profesorilor implicai s pregteasc elevul pentru
ceea ce va urma.
%o*petenele care ur*ea:, -, fie do<Endite
n aceast csu, profesorii trebuie s nscrie competenele care urmeaz a fi
dobndite. Acest lucru poate implica continuarea lucrului pentru aceleai competene
sau identificarea altora care trebuie avute in vedere.
Re-ur-e nece-are
Aici se pot nscrie orice fel de resurse speciale solicitate:manuale tehnice, reete,
seturi de instruciuni i orice fel de fie de lucru care ar putea reprezenta o surs de
informare suplimentar pentru un elev care nu a dobndit competenele cerute.
*ot acest format de fi este un instrument detaliat de nregistrare a progresului
elevilor+ ,entru fiecare elev se pot reali-a mai multe astfel de fie pe durata
derulrii modulului. aceasta permind evaluarea precis a evoluiei elevului. n
acelai timp furni-nd informaii relevante pentru anali-+

5!
38 4i<lio.rafie
1. Sorin, Tudor (1998). Tehnici de programare,Bucuresti:Editura PegasuS.
2. Mateescu, Daniel George. Moraru, Florin Pavel(2006). Informatica pentru liceu si
'acalaureat !ateria de clasa a 3I1a, Sibiu: Editura Donaris.
3. Cerchez, Emanuela. Serban, Marinel.(2005) Programarea in lim'a4ul C5C66
volumul 7, Bucuresti:Editura Polirom.
4. Milosescu, Mariana.(2005) Informatica clasa a 31a, Bucuresti: Editura Diactica si
Pedagogica.
5. Sorin, Tudor. (2008) Informatica clasa a I3 si 3 8a , Bucuresti: L&S nfo-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 12.05.2009
9. *** La www.educativ.ro 12.05.2009
10. *** La http://www.scribd.com/doc/8066145/Metoda-Backtracking 13.05.2009
11. *** La ///.d,dact,c.r0/f,les/12/1et0da2 greedy .d0c 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


58

Vous aimerez peut-être aussi