Documente Academic
Documente Profesional
Documente Cultură
Modulul V - Romana Salajan I
Modulul V - Romana Salajan I
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
2009
AUTOR:
ROMANA SLJAN profesor grad didactic I
COORDONATOR:
MARIANA VIOLETA CIOBANU - Profesor, grad didactic I, Colegiul Tehnic
Media Bucureti
CONSULTAN:
IOANA CRSTEA expert CNDIPT
ZOICA VLDU expert CNDIPT
ANGELA POPESCU expert CNDIPT
DANA STROIE expert CNDIPT
Cuprins
I.
Introducere...........................................................................................4
II.
Documente necesare pentru activitatea de predare............................6
III. Resurse...................................................................................................7
2
I.
Introducere
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 Informatic, calificarea Analist programator.
Modulul Tehnici clasice de programare cuprinde competenele 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.
Modulul Tehnici clasice de programare se studiaz n anul I 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.
3
Competene
Teme
Aplic principiile
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
recursivitii i
iterativitii n
rezolvarea
problemelor
Utilizeaz
Fise suport
tehnicile clasice
Competene
Teme
Fise suport
Backtracking
metodei
de programare
Cri de specialitate;
Reviste de specialitate;
III. Resurse
Tema 1. Noiunea de recursivitate
Fia suport 1.1
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.
1. 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.
Atunci cnd scriem un algoritm recursiv, este suficient s gndim exact ce se
ntmpl la un anumit nivel, pentru c la orice nivel se ntmpl exact acelai lucru.
Exemplele prezentate sunt procese recursive infinite, prezentnd un ir infinit de
televizoare, respectiv anunul este perpetuu.
Un algoritm recursiv corect trebuie s se termine, contrar programul se va termina cu
eroare i nu vom primi rezultatul ateptat. Procesele descrise prin subprogram 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.
Sugestii metodologice
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.
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 .
Reflexia
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.
Exemplificare
S se calculeze n!, n natural.
Pentru a scrie o functie recursiv prelum din matematic relaia:
1, n 0
n * (n 1)! , altfel
n! =fact(n)=
n, N
Condiia 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(I k,P) , unde M este mulimea ce conine
instruciunile Ik i pe P insui.
Exemplu:
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.
Sugestii metodologice
UNDE ? Coninutul poate fi predat n sala de clas cu un videoproiector, sau n
laboratorul de informatic .
CUM ?
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.
Ca materiale suport se pot folosi:
10
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.
Exemplu 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.
a, a b
cmmdc(a b, b), a b
cmmdc(a, b a), a b
Cmmdc(a,b)=
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;
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.
Fib(n)=
1, n 0
1, n 1
fib( n 1) fib ( n 2)
in rest
12
#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 ( F ( x 2), x 12
F(x)=
n 1, m 0
Ack (m 1,1), n 0
Ack(m,n)=
Sugestii metodologice
UNDE ? Coninutul poate fi predat doar n laboratorul de informatic, indicat fiecare
elev s aiba locul lui la calculator.
CUM ? 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.
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.
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<< ;
15
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);}
Exemplul 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.
true, daca x (a1, a2,..., an)
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;}
Exemplul 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>
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<<]=;
17
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;}
Exemplul 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
UNDE ? Coninutul poate fi predat n sala de clas, dar se recomand laboratorul de
informatic.
CUM ? 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..
18
19
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
rezolv(x1);
rezolv(xk);
}
else }
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:
#include <iostream.h>
int v[10],n;
20
{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
UNDE ? Coninutul poate fi predat n sala de clas, dar se recomand laboratorul de
informatic.
CUM ? 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.
22
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,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 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.
void back(int p)
{int i;
23
for(i=1;i<=n;i++)
{st[p]=i;
if valid(p)
if(p==n)
tipar (p)
else back(p+1);
} }
Exemplul 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 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;
24
if (corect)perm(k+1);}}
t[k]=0;}
void main()
{cout<<n=;
cin>>n;
perm(1);}
Exemplul 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.
void dame(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] || abs(t[k]-t[j])==(k-j))
corect=0;
if (corect)dame(k+1);}}
t[k]=0;}
Exemplul 3.
25
#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
26
27
Axiom
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.
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. Pentru rezolvare, utilizm o definiie recursiv a celui
mai mare divizor comun pentru dou numere naturale a i b.
a, a b
cmmdc(a b, b), a b
cmmdc(a, b a), a b
Cmmdc(a,b)=
#include <iostream.h>
void main()
{cout<<a=;
cin>>a;
cout<<b=;
cin>>b;
while(a!=b)
if(a>b)
a=a-b;
else b=b-a;
cout<<cmmdc=<<a;}
28
Exemplu 2.
Fie fib: N N. S se calculeze fib(n), pentru n natural.
Fib(n)=
1, n 0
1, n 1
fib( n 1) fib ( n 2)
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;}
Exemplu 3.
Calculul funciei Manna-Pnueli pentru un x intreg.:
29
x 1, x. 12
F ( F ( x 2), x 12
F(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--;
if(k>0)st[k]=st[k+1]-1;}
cout<<n=[1]-1;}
Exemplu 4.
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 1,1), n 0
Ack(m,n)=
#include <iostream.h>
int st[10000][2];
30
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;}
Exemplu 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;}
31
Sugestii metodologice
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.
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
32
0
1
1
1
2
2
3
3
4
5
5
8
6
1
3
7
2
1
8
3
4
1,
1,
U(n-1)+U(n-2),
n=0
n=1
n>=2
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:
33
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.
Exemplu 2
Se consider irurile definite recurent astel:
A0=a; b0=b; a,b>0:
an
a n 1 bn 1
, bn a n 1bn 1
2
#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()
34
{cout<<a=;
cin>>a;
cout<<b=;
cin>>b;
cout<<n;
cin>>n;
cout<<an(n)<< <<bn(n);}
Este indicat s se argumenteze bine care metod este aleas pentru rezolvarea
unei probleme.
Sugestii metodologice
UNDE ?
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 INTERNET. Configuraia calculatoarelor trebuie s
permit rularea aplicaiilor prin care vor fi formate competenele specifice.
CUM ? 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.
35
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.
36
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.
37
Restricii
Metoda Divide Et 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.
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.
39
Apelul subprogramului
Iniial p=1, q=n, rezult DivImp(V,1,n).
Sugestii metodologice
UNDE ? Coninutul poate fi predat n sala de clas sau n laboratorul de informatic.
CUM ? Se recomand utilizarea unui videoproiector pentru o mai buna vizualizare i
implicit nelegere a noilor cunotine..
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.
40
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 x, ce aparine lui A;
- presupunnd generate elementele x 1,x2 ,xk , aparinnd mulimilor A1, A2 ,Ak
se alege (dac exist) xk+1 , primul element disponibil din mulimea Ak+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,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 Ak ,
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+1 din Ak+1.
- nu le ndeplinete, caz n care se reia algoritmul considernd generate
elementele x1,x2 ,xk , iar elementul xk+1 se caut ntre elementele mulimii Ak+1, rmase
netestate.
Algoritmii se termin atunci cnd nu exist nici un element x 1 din A1 netestat.
Observaie: tehnica Backtracking 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 A1, se va gsi pe primul nivel al
stivei, x2 din A2 se va gsi pe al
doilea nivel al stivei,... xk din Ak se va gsi
pe nivelul k al stivei. n acest fel, ...
stiva (notat ST) va arta astfel:
xk
x2
x1
41
ST
Nivelul k+1 al stivei trebuie iniializat (pentru a alege, n ordine, elementele mulimii
k+1 ). Iniializarea trebuie fcut cu o valoare aflat (n relaia de ordine considerat,
pentru mulimea Ak+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.
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_Suceeesor(). 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_Suceeesor()) && !E_Valid());
if (AS)
if (Solutie()) Tipar();
else {k++; Init();}
else k--;
}
}
Observaie: 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 backtracking trebuie aplicat numai n ultim
instan.
Exemplu:
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).
Observm c o dam trebuie s fie plasat singur pe linie. Plasm prima dam pe
linia 1, coloana 1.
D
Observm c a treia dam nu poate fi plasat n linia 3. ncercm atunci plasarea celei
de-a doua dame n coloana 4.
D
D
43
Acum este posibil s plasm a patra dam n coloana 3 si astfel am obinut o soluie a
problemei.
D
D
D
D
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).
3 ST(4)
1
ST(3) n general ST(i)=k semnific faptul c pe linia i dama ocup poziia k.
4
2 ST(2)
ST(1)
Astfel n tabla 4 x4 avem situaia:
st(1)= 1 i = 1
D
st(3)= 3 j = 3
D
|st(1) - st(3)| = |1 3| = 2
D
|i j| = |1 3| = 2
D
sau situaia
D
D
D
D
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 backtracking.
Aceasta presupune c imediat ce am gsit dou dame care se atac, s relum
cutarea.
lat algoritmul, conform strategiei generate de backtracking:
44
else{k++;Init();}
else k--;
}
}
main()
{ cout<<"n=";cin>>n;
back();
}
Sugestii metodologice
UNDE ?
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 INTERNET. Configuraia calculatoarelor trebuie s
permit rularea aplicaiilor prin care vor fi formate competenele specifice.
CUM ? 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..
46
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.
47
#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(void)
{
cout<<"\nOrdinul tablei de sah n=";
cin>>n;
nr_solutie=0;
back_recursiv(1);
cout<<"\nSFARSIT\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).
Exemplu 2. 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}.
49
#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;
}
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();
}
Exemplul 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;
}
50
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++)
{ st[k]=i;
if (valid(k)) if(k==p) tipar(k);
else back(k+1);
}
}
main()
{ init();
back(1);
getch();
}
Sugestii metodologice
Se va urmri:
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.
52
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:
53
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, 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.
Consecina 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(n2).
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. 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.
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. 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.
Probleme pentru care Greedy obine soluia optim
Exemplul 1. Problema spectacolelor
54
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,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 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,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[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]=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;
55
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]];}
}
}
Exemplul 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. In prima situaie, problema poart numele de problema continu a
rucsacului, iar n a doua avem problema 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.
Problema continu a rucsacului, n care persoana are posibilitatea s taie obiectele. 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.
Sugestii metodologice
UNDE ? Coninutul poate fi predat n sala de clasa cu ajutorul unui videoproiector, dar
se recomand laboratorul de informatic.
CUM ? 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:
58
Activiti efectuate i
comentarii
Data
activitatii
Bine
Activitate 1
Comp 1
(Aici se
trece
numele
competentei)
Activitate2
Comentarii
Prioriti de dezvoltare
Resurse necesare
59
Evaluare
Satisfctor
Refacere
Resurse necesare
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.
60
V. 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. Serban, 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 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 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
61