Calcular fatorial de um número em C++

Jinku Hu 12 outubro 2023
  1. Use o método iterativo para calcular o fatorial de um número em C++
  2. Use o método recursivo para calcular o fatorial de um número
Calcular fatorial de um número em C++

Este artigo irá explicar vários métodos de como calcular o fatorial de um número em C++.

Use o método iterativo para calcular o fatorial de um número em C++

O fatorial do número é calculado multiplicando todos os números inteiros começando de um e incluindo o número fornecido. Observe que o algoritmo direto é usar iteração usando uma das instruções de loop. No código de exemplo a seguir, implementamos um loop while que acumula os valores multiplicados em uma variável e retorna o inteiro resultante por valor para o chamador. Observe que o loop diminui o número em cada bucle e a expressão n-- é utilizada para armazenar o valor antes de ser diminuído.

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

Resultado:

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

Use o método recursivo para calcular o fatorial de um número

Outra solução é empregar chamadas de função recursivas para cálculo fatorial. A recursão é o recurso da função para chamar a si mesma a partir de seu corpo. A parte principal da função recursiva é definir uma condição que garanta que ele retorne ao chamador e não seja arrastado para um comportamento de loop infinito. Nesse caso, especificamos a condição if para denotar o estado em que a chamada recursiva deve ser feita. Caso contrário, a função deve retornar 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;
}

Resultado:

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

Alternativamente, podemos mesclar a função recursiva em uma implementação de uma linha onde a expressão ?: Avalia se o número fornecido é igual a 0 ou 1, caso em que a função retorna 1. Se a condição for falsa, a chamada recursiva é feita e continua com o novo quadro de pilha de funções até que a condição seja verdadeira. O código de exemplo produz o fatorial de cada elemento no vetor 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;
}

Resultado:

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

Artigo relacionado - C++ Math