Basis van programmeren in C
int fact(int n) {
if (n <= 1)
return 1;
return n * fact(n - 1);
}int is 32 bits (maximum 2147483647). Wat is de grootste n waarvoor de bovenstaande functie fact(n) de faculteit van n correct en zonder overloop teruggeeft?
- A12
- B13
- C20
Antwoord en toelichting tonen
Antwoord: A. 12
fact is een functie die met recursie zichzelf aanroept als n × fact(n − 1) en 1 teruggeeft als n 1 of kleiner is. 12! = 479001600 is kleiner dan het maximum van int, 2147483647, dus wordt correct berekend, maar 13! = 6227020800 overschrijdt het maximum. Bij fact(13) treedt in de laatste vermenigvuldiging 13 × 479001600 overloop van een integer met teken op, en dat is ongedefinieerd gedrag. Niet-geoptimaliseerde gcc op x86-64 geeft bijvoorbeeld 1932053504 terug, de rest van 6227020800 bij deling door 2³², maar dit resultaat is niet gegarandeerd. Voor grotere n gebruik je bijvoorbeeld de 64-bits long long (tot n = 20).