Grundlagen der Programmiersprache C
int fact(int n) {
if (n <= 1)
return 1;
return n * fact(n - 1);
}int habe 32 Bit (Maximalwert 2147483647). Was ist das größte n, für das die obige Funktion fact(n) die Fakultät von n ohne Überlauf korrekt zurückgibt?
- A12
- B13
- C20
Antwort und Erläuterung anzeigen
Antwort: A. 12
fact ruft sich wie in n × fact(n − 1) selbst auf und gibt 1 zurück, sobald n höchstens 1 ist; eine solche Funktion arbeitet mit Rekursion. 12! = 479001600 ist kleiner als der int-Maximalwert 2147483647 und wird korrekt berechnet, 13! = 6227020800 dagegen überschreitet den Maximalwert. In fact(13) tritt bei der letzten Multiplikation 13 × 479001600 ein Überlauf einer vorzeichenbehafteten Ganzzahl auf, und das ist undefiniertes Verhalten. Mit gcc auf x86-64 ohne Optimierung wird beispielsweise 1932053504 zurückgegeben, der Rest von 6227020800 geteilt durch 2³², doch dieses Ergebnis ist nicht garantiert. Für größere n verwendet man etwa das 64-Bit-long long (bis n = 20).
Weiter: 9 weitere Fragen zu Grundlagen der Programmiersprache C