Calcul factoriel d'un nombre en C++

Jinku Hu 12 octobre 2023
  1. Utiliser la méthode itérative pour calculer la factorielle d’un nombre en C++
  2. Utiliser la méthode récursive pour calculer factorielle d’un nombre
Calcul factoriel d'un nombre en C++

Cet article explique plusieurs méthodes de calcul de la factorielle d’un nombre en C++.

Utiliser la méthode itérative pour calculer la factorielle d’un nombre en C++

La factorielle du nombre est calculée en multipliant tous les nombres entiers en commençant par un et en incluant le nombre donné. Notez que l’algorithme simple consiste à utiliser l’itération en utilisant l’une des instructions de boucle. Dans l’exemple de code suivant, nous avons implémenté une boucle while qui accumule les valeurs multipliées dans une variable et renvoie l’entier résultant par valeur à l’appelant. Notez que la boucle décrémente le nombre dans chaque cycle et que l’expression n-- est utilisée pour stocker la valeur avant qu’elle ne soit décrémentée.

#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

int factorial1(int n) {
  int ret = 1;
  while (n > 1) ret *= n--;
  return ret;
}

template <typename T>
void printVector(vector<T> &vec) {
  for (const auto &item : vec) {
    cout << item << ", ";
  }
  cout << endl;
}

int main() {
  vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

  printVector(vec);

  for (const auto &item : vec) {
    cout << factorial1(item) << ", ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Production:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800,

Utiliser la méthode récursive pour calculer factorielle d’un nombre

Une autre solution consiste à utiliser des appels de fonction récursifs pour le calcul factoriel. La récursivité est la caractéristique de la fonction de s’appeler à partir de son corps. La partie principale de la fonction récursive est de définir une condition qui garantit qu’elle revient à l’appelant et ne se laisse pas entraîner dans un comportement de style boucle infinie. Dans ce cas, nous spécifions la condition if pour désigner l’état où l’appel récursif doit être effectué. Sinon, la fonction doit renvoyer 1.

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

int factorial2(int n) {
  if (n > 1) return factorial2(n - 1) * n;
  return 1;
}

template <typename T>
void printVector(vector<T> &vec) {
  for (const auto &item : vec) {
    cout << item << ", ";
  }
  cout << endl;
}

int main() {
  vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

  printVector(vec);

  for (const auto &item : vec) {
    cout << factorial2(item) << ", ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Production:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800,

Alternativement, nous pouvons fusionner la fonction récursive dans une implémentation à une ligne où l’expression ?: Évalue si le nombre donné est égal à 0 ou 1, auquel cas la fonction renvoie le 1. Si la condition est fausse, l’appel récursif est effectué et il continue avec le nouveau cadre de pile de fonctions jusqu’à ce que la condition soit vraie. L’exemple de code produit la factorielle de chaque élément dans le vector déclaré.

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

int factorial3(int n) { return (n == 1 || n == 0) ? 1 : n * factorial3(n - 1); }

template <typename T>
void printVector(vector<T> &vec) {
  for (const auto &item : vec) {
    cout << item << ", ";
  }
  cout << endl;
}

int main() {
  vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

  printVector(vec);

  for (const auto &item : vec) {
    cout << factorial3(item) << ", ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Production:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800,
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Article connexe - C++ Math