Calcular factorial de un número en C++

Jinku Hu 12 octubre 2023
  1. Utilice el método iterativo para calcular el factorial de un número en C++
  2. Utilice el método recursivo para calcular el factorial de un número
Calcular factorial de un número en C++

Este artículo explicará varios métodos de cómo calcular el factorial de un número en C++.

Utilice el método iterativo para calcular el factorial de un número en C++

El factorial del número se calcula multiplicando todos los números enteros comenzando por uno e incluyendo el número dado. Tenga en cuenta que el algoritmo sencillo es utilizar la iteración utilizando una de las declaraciones de bucle. En el siguiente código de ejemplo, implementamos un bucle while que acumula los valores multiplicados en una variable y devuelve el número entero resultante por valor al llamador. Tenga en cuenta que el bucle disminuye el número en cada bucle, y la expresión n-- se utiliza para almacenar el valor antes de que disminuya.

#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;
}

Producción :

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

Utilice el método recursivo para calcular el factorial de un número

Otra solución es emplear llamadas de función recursivas para el cálculo factorial. La recursividad es la característica de la función para llamarse a sí misma desde su cuerpo. La parte principal de la función recursiva es definir una condición que asegure que regresa a la persona que llama y no se ve arrastrada a un comportamiento de estilo bucle infinito. En este caso, especificamos la condición if para indicar el estado en el que se debe realizar la llamada recursiva. De lo contrario, la función debería devolver 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;
}

Producción :

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

Alternativamente, podemos fusionar la función recursiva en una implementación de una sola línea donde la expresión ?: Evalúa si el número dado es igual a 0 o 1, en cuyo caso la función devuelve el 1. Si la condición es falsa, entonces se realiza la llamada recursiva y continúa con el nuevo marco de pila de funciones hasta que la condición sea verdadera. El código de ejemplo genera el factorial de cada elemento en el vector declarado.

#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;
}

Producción :

1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800,
Autor: 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

Artículo relacionado - C++ Math