Calcular fatorial de um número em C++
- Use o método iterativo para calcular o fatorial de um número em C++
- Use o método recursivo para calcular o fatorial de um número
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,
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