Bases de la programmation en C
int fact(int n) {
if (n <= 1)
return 1;
return n * fact(n - 1);
}int fait 32 bits (valeur maximale 2147483647). Quelle est la plus grande valeur de n pour laquelle la fonction fact(n) ci-dessus renvoie correctement la factorielle de n, sans dépassement de capacité ?
- A12
- B13
- C20
Afficher la réponse et l'explication
Réponse : A. 12
fact s'appelle elle-même sous la forme n × fact(n − 1) et renvoie 1 lorsque n vaut 1 ou moins : c'est une fonction qui utilise la récursivité. 12! = 479001600 est inférieur à la valeur maximale d'un int, 2147483647, et se calcule correctement, mais 13! = 6227020800 dépasse ce maximum. Dans fact(13), la dernière multiplication, 13 × 479001600, provoque un dépassement de capacité d'entier signé, ce qui est un comportement indéfini. Par exemple, gcc sur x86-64 sans optimisation renvoie 1932053504, le reste de la division de 6227020800 par 2³², mais ce résultat n'est pas garanti. Pour des n plus grands, on utilise par exemple le type long long de 64 bits (jusqu'à n = 20).
Continuer : 9 autres questions sur Bases de la programmation en C