110 likes | 294 Vues
Gestructureerd programmeren in C. GESPRG Les 6. Scope versus Lifetime. Elke variabele heeft een : Scope ( bereik ) waar kun je de variabele gebruiken ( tijdens het coderen van het programma )
E N D
Gestructureerd programmeren in C GESPRG Les 6
Scope versus Lifetime • Elkevariabeleheefteen: • Scope (bereik) waar kun je de variabelegebruiken (tijdens het coderen van het programma) • Lifetime (levensduur) wanneerbestaat de variabele (tijdens het uitvoeren van het programma) Een parameter is een lokale variabele (die bij de functieaanroep wordt geïnitialiseerd).
Scope int a; void func(void) { inta, b; … } intmain(void) { intb; … func(); … return 0; } De globale a is verborgen (door de lokale a). In scope Out of scope
Lifetime Reserveergeheugenruimtevoorlokalea en b in func inta; void func(void) { inta, b; … } intmain(void) { intb; … func(); … return 0; } Geefgeheugenruimtevrij van lokalea en b in func Reserveergeheugenruimtevoorglobalea Reserveergeheugenruimtevoorlokaleb in main Geefgeheugenruimtevrij van lokaleb in main Geefgeheugenruimtevrijvoorglobalea
Eenfunctie die zichzelfaanroept Recursieve functie
Faculteit • Bereken n! = 1 * 2 * 3 * … * n Iteratieve implementatie intfaculteit(int n) { inti, res = 1; for (i = 1; i <= n; i = i + 1) { res = res * i; } return res; } 1 alsn = 0 n! = n * (n - 1)! alsn > 0 Recursieve implementatie intfaculteit(int n) { if (n > 0) returnn * faculteit(n - 1); return 1; } Wat is beter ?
Recursieveaanroep(voorbeeld) intj = faculteit(4); intj = 24; return 24; return 24; return 4 * 6; return 4 * faculteit(3); return 3 * faculteit(2); return 6; return 6; return 3 * 2; return 2 * 1; return 2 * faculteit(1); return 2; return 2; return 1 * 1; return 1; return 1; return 1 * faculteit(0); intfaculteit(int n) { if (n > 0) returnn * faculteit(n - 1); return 1; } return 1;
n boven k • Bereken n boven k = n! / (k! * (n - k)!) • n boven k = 1 voor k == 0 en k == n. Voor 0<k<n geldt: intn_boven_k(int n, int k) { return faculteit(n) / (faculteit(k) * faculteit(n - k)); } Wat is beter ? Recursieve implementatie Recursieve implementatie intn_boven_k(int n, int k) { if (k == 0 || k == n) return 1; returnn_boven_k(n - 1, k - 1) + n_boven_k(n - 1, k); }
Recursieveaanroep(voorbeeld) • intn_boven_k(int n, int k) { • if (k == 0 || k == n) return1; • returnn_boven_k(n - 1, k - 1) + n_boven_k(n - 1, k); • } intj = n_boven_k(4, 2); return 3 + n_boven_k(3, 2); return n_boven_k(3, 1) + n_boven_k(3, 2); return n_boven_k(2, 0) + n_boven_k(2, 1); return 1 + n_boven_k(2, 1); return 1 + 2; Maakzelfaf! return 1 + n_boven_k(1, 1); return n_boven_k(1, 0) + n_boven_k(1, 1); return 1; return 1 + 1; return 1; return 1;
Domein • Faculteit • Domein = [0..12] • n boven k • Domeinversie met faculteit = [0..12] • Domeinrecursieveversie = [0..33] In ditgeval is de recursieveversiedus “beter”.
Huiswerk • Schrijf een recursieve functie int fib(int n) die het nde getal uit de fibonacci rij berekent. Zie: http://en.wikipedia.org/wiki/Fibonacci_number Paragraaf 4.13 geeft een iteratieve oplossing.Het antwoord op deze vraag staat in het boek in paragraaf 5.15. Eerst zelf proberen natuurlijk! • Bestudeer C boek: • paragrafen 5.6, 5.7en 5.15.