user
Comment écrire une fonction factorielle en C ?
alphonsio

Fonction factorielle en C

Il existe deux façons d'écrire la fonction factorielle en C :

1. L'approche itérative

// Retourne la factorielle de n (n!)
unsigned long long factorielle(int n) {
    unsigned long long result = 1;
    for (int i = 1; i <= n; i++) result *= i;
    return result;
}

2. L'approche récursive

// Retourne la factorielle de n
unsigned long long factorielle(int n) {
    return (n <= 1)?1:n * factorielle(n - 1);
}

Pour écrire une fonction en C qui calcule la factorielle d'un nombre n (notée n!n! ), on peut utiliser deux approches principales : une approche récursive ou une approche itérative. Voici comment faire les deux :

1. Approche itérative

#include <stdio.h>

// Retourne la factorielle de n (n!)
unsigned long long factorielle(int n) {

    // Variable pour le calcul de la factorielle
    unsigned long long result = 1;

    // Multiplie result par 1, puis 2, puis 3 ...
    for (int i = 1; i <= n; i++) {
        result *= i;
    }

    // Retourne le résultat du calcul de la factorielle
    return result;
}

// Programme principal
int main() {
    int nombre;

    // Demande la saisie d'un entier au clavier
    printf("Entrez un nombre: ");
    scanf("%d", &nombre);

    // Si le nombre saisi est négatif, affiche un message d'erreur, sinon affiche la factorielle
    if (nombre < 0) {
        printf("La factorielle n'est pas définie pour les nombres négatifs.\n");
    } else {
        printf("La factorielle de %d est %llu\n", nombre, factorielle(nombre));
    }
    
    return 0;
}

2. Approche récursive

#include <stdio.h>

// Retourne la factorielle de n
unsigned long long factorielle(int n) {
    // Par convention, 0! et 1! sont égales à 1
    if (n <= 1) {
        return 1;
    } else {
        // Appel récursif de la fonction factorielle n! = n x (n-1)!
        return n * factorielle(n - 1);
    }
}

// Programme principal
int main() {
    int nombre;

    // Demande la saisie d'un entier au clavier
    printf("Entrez un nombre: ");
    scanf("%d", &nombre);

    // Si le nombre saisi est négatif, affiche un message d'erreur, sinon affiche la factorielle
    if (nombre < 0) {
        printf("La factorielle n'est pas définie pour les nombres négatifs.\n");
    } else {
        printf("La factorielle de %d est %llu\n", nombre, factorielle(nombre));
    }
    
    return 0;
}

Explication :

  • Version itérative : Cette version utilise une boucle for pour multiplier successivement les nombres de 1 à n, stockant le résultat dans la variable result.

  • Version récursive : Cette version fait appel à la fonction factorielle elle-même jusqu'à ce que la condition de base (n <= 1) soit atteinte. La factorielle de n est alors le produit de n et de la factorielle de n-1.

Remarque :

  • unsigned long long est utilisé pour gérer des nombres potentiellement grands, car les factorielles peuvent croître rapidement en taille.
  • La fonction prend un entier en entrée et renvoie 1 pour des valeurs négatives ou 0, car la factorielle n'est pas définie pour ces valeurs. Dans l'exemple donné, un message d'erreur est affiché si l'utilisateur entre un nombre négatif.