Sunteți pe pagina 1din 6

PROIECT DIDACTIC

COLEGIUL TEHNIC ENERGETIC CONSTANŢA

Disciplina: Informatică
Clasa: a X-a I
Profesor: Adina Elena Piţigoi

Unitatea de învăţare: Implementarea algoritmilor într-un limbaj de programare

Tema: Recursivitate
 Tipul lecţiei: - dobândire de noi cunoştinţe
 Locul de desfăşurare: Laboratorul de informatică

Nivelul iniţial al clasei:


 Elevii şi-au însuşit toate noţiunile teoretice legate de tipurile de utilizarea subprogramelor;
 Elevii utilizează şi operează corect cu funcţiile şi procedurile nerecursive;

Competenţa generală:
⇒ realizarea de aplicaţii utilizând algoritmi specifici;
Competenţe specifice:
1. aplicarea algoritmilor recursivi;
2. transpunerea unei probleme în termeni recursivi;
3. aplicarea cunoştinţelor în cadrul unor subprograme recursive;
Competenţe derivate:
C1. Să definească corect funcţiile recursive;
C2. Să compare varianta iterativă cu cea recursivă pentru aceeaşi problemă;
C3. Să analizeze modul diferit de funcţionare a celor două implementări;
C4. Să argumenteze corect alegerea unei variante;
Strategii didactice:
 Principii didactice:
- principiul participării şi învăţării active;
- principiul asigurării progresului gradat al învăţării;
- principiul conexiunii inverse;

1
 Metode de învăţământ:
- metode de comunicare orală: expunere, conversaţie, problematizare;
- metode de acţiune: exerciţiul, învăţare prin descoperire;
 Procedee de instruire:
- explicaţia în etapa de comunicare;
- învăţarea prin descoperire, prin rezolvarea de probleme;
- problematizarea prin crearea situaţiilor problemă;
- conversaţia de consolidare a cunoştinţelor în etapa de fixare a cunoştinţelor;
 Forme de organizare: frontală şi individuală;
 Forme de dirijare a învăţării: dirijată de profesor sau independentă;
 Resurse materiale:
- Dorian Stoilescu – „Manual de C/C++ pentru licee”;
- Vlad Huţanu, Tudor Sorin – „Informatică – manual pentru clasa a XI-a”
- Dana Lica, Mircea Paşoi – „Informatică – Fundamentele Programării. Culegere
de probleme pentru clasa a X-a”
- fişe de lucru;
 Metode de evaluare:
- evaluare iniţială: întrebări orale;
- set de aplicaţii;
 Desfăşurarea lecţiei:
• Moment organizatoric:
♦ pregătirea lecţiei:
- întocmirea proiectului didactic;
- pregătirea setului de întrebări;
- pregătirea setului de aplicaţii;
- pregătirea temei;
♦ organizarea şi pregătirea clasei:
- verificarea frecvenţei;
♦ captarea atenţiei clasei:
- anunţarea subiectului pentru tema respectivă;
- anunţarea obiectivelor urmărite;
- anunţarea modului de desfăşurare a activităţii;

2
• Reactualizarea cunoştinţelor
1. Se realizează un set de întrebări pentru reactualizarea cunoştinţelor teoretice ca mai jos:

Întrebare Răspuns aşteptat


1. Unde sunt memorate variabilele locale? Segmentul de stivă
Memorarea parametrilor transmişi se face
2. Care este ordinea în care parametri transmiţi
în ordinea în care aceştia figurează în
sunt memoraţi?
antet: de la stânga la dreapta.
3. Ce conţine stiva când parametrii sunt transmişi
Valorile transmise
prin valoare?
4. Dar prin referinţă? Adresele variabilelor
5. Numele parametrilor formali trebuie să fie
Nu
acelaşi cu cel al parametrilor efectivi?

• Comunicarea noilor cunoştinţe:


DEFINIŢIA RECURSIVITĂŢII
Recursivitatea reprezintă o tehnică de programare de o importanţă deosebită. Ea permite o
exprimare extrem de concisă şi clară a algoritmilor de rezolvare a unor probleme complexe.
Un subprogram este recursiv dacă se apelează pe el însuşi (se autoapelează).
REALIZAREA AUTOAPELULUI
Considerăm următorul subprogram:
#include<iostream.h>
void exemplu (int n)
{ if (n!=0)
{ cout<<n<<endl;
exemplu(n-1);}
}
void main()
{ exemplu(3);
}
Se observă că tipul funcţiei este de tip void şi deci nu returnează nici o valoare. De aceea
nu poate fi utilizată în calcului unei expresii
Parametrul efectiv 3 este memorat în segmentul de stivă. Pe parcursul rulării programului
stiva va conţine:

3
0 0

1 1 1 1

2 2 2 2 2 2

3 3 3 3 3 3 3 3

Programul afişează:
3
2
1
În cazul acestui program
#include<iostream.h>
int suma(int n)
{ if (n!=0)
return n+suma(n-1);
}
void main()
{
cout<<suma(3);
}
Deşi în stivă sunt introduse şi apoi extrase aceleaşi elemente, funcţia fiind de tip int poate fi
utilizată în expresia ce va fi returnată şi astfel putem calcula 1+2+3. Programul afişează 6.
Diferenţa dintre cele două subprograme este următoarea:
• În cazul funcţiilor de tip void, autoapelul se realizează prin apelul funcţiei respective, din
interiorul ei. Apelul se face la fel ca în cazul în care funcţia este apelată din exterior.
• În cazul funcţiilor care nu sunt de tip void, autoapelul se realizează prin instrucţiunea return.
Ea este de forma
return expresie
dar în expresia respectivă trebuie să intre şi funcţia care se autoapelează.

MECANISMUL RECURSIVITĂŢII

Considerăm următoarea problemă:


Să se calculeze recursiv n!.

4
Pentru înţelegerea noţiunii de factorial aleg doi şi apoi trei copii şi căutăm toate
posibilităţile de aşezare pe 2 sau 3 scaune. De aici, deducem că
2!=2*1!=2*1*0!= 2*1*1=2
3!=3*2!=3*2*1!=3*2*1*0!=3*2*1*1=6
Prin generalizare, obţinem
n!=n*(n-1)!=n*(n-1)*(n-2)!=…=n*(n-1)*(n-2)*…*3*2*1
Definiţia recursivă a lui n! este:
 1, n=0
n!= fact ( n) =  cu n ∈ N
n ⋅ fact(n - 1), altfel
Subprogramul fact transcrie definiţia recursivă.
#include<iostream.h>
int fact (int n)
{ if (n==0) return 1;
else return n*fact(n-1);
}
void main()
{
int n;
cout<<“n=“;
cin>>n;
cout<<n<<“!=”<<fact(n);
}

CUM GÂNDIM UN ALGORITM RECURSIV?

• Ce se întâmplă la un nivel se întâmplă la orice nivel.


• Subprogramul care se autoapelează trebuie să conţină instrucţiunile corespunzătoare unui
nivel.
• Starea tratată de subprogram se găseşte pe un anumit nivel al stivei.
Observaţii
• Pentru orice algoritm recursiv există unul iterativ care rezolvă aceeaşi problemă.
• Nu întotdeauna alegerea unui algoritm recursiv reprezintă un avantaj.
• Recursivitatea presupune mai multă memorie în comparaţie cu iterativitatea.

5
Asigurarea feedback-ului şi evaluarea performanţei

Întrebare Răspuns aşteptat


1) Orice subprogram recursiv se poate implementa şi
A
nerecursiv
2) Funcţia main () poate conţine autoapel. F
3) La fiecare apel recursiv al unui subprogram, in
segmentul de stiva sunt memorate
a) Adresa de revenire, valorile variabilelor locale
si a parametrilor transmişi prin referinţă
b) Adresa de revenire si valorile variabilelor
globale c)
c) Adresa de revenire, valorile variabilelor locale
si a parametrilor transmişi prin valoare si
adrese parametrilor transmişi prin referinţa
d) Adresa de revenire, valorile locale si a
variabilelor globale
4) Fie funcţia recursivă:
int f(int n)
{
if (n ==0 ) return 0;
else return ( f(n-1)+2*n-1)
}
d)
Precizaţi valoarea lui n pentru care f(n)= 36
a) 9
b) 3
c) 15
d) 6

Temă:
1. Fie A o mulţime cu n elemente. Submulţimile ordonate ale lui A având fiecare câte k
elemente, unde 0≤k≤n, se numesc aranjamente de n luate câte k. Două aranjamente de n
elemente luate câte k se deosebesc prin natura elementelor lor şi prin ordinea lor. Numărul
k
total de aranjamente de n elemente luate câte k se notează cu An şi se calculează după
n!
formula: An = . Să se scrie un program ce calculează aranjamentele unei mulţimi de n
k

k!
elemente luate câte k.

2. Se consideră un şir de n valori naturale de cel mult 9 cifre. Determinaţi numărul de valori
care pot fi scrise sub forma k!. În cadrul subprogramului, se vor defini două subprograme
recursive:
a. Funcţia Ok, care verifică dacă o valoare primită printr-un parametru reprezintă
factorialul unei valori. Funcţia returnează valoarea 1 sau 0.
b. Funcţia Nr, care permite citirea celor n numere şi returnează numărul de valori
factoriale. În cadrul ei se va apela funcţia Ok.
Exemplu: Pentru n=5 şi valorile 7, 16, 6, 13, 24, se va afişa 2, deoarece 6=1*2*3,
24=1*2*3*4.