Calcola fattoriale di un numero in C++
- Usa il metodo iterativo per calcolare il fattoriale di un numero in C++
- Usa il metodo ricorsivo per calcolare il fattoriale di un numero
Questo articolo spiegherà diversi metodi su come calcolare il fattoriale di un numero in C++.
Usa il metodo iterativo per calcolare il fattoriale di un numero in C++
Il fattoriale del numero si calcola moltiplicando tutti i numeri interi partendo da uno e includendo il numero dato. Si noti che l’algoritmo semplice consiste nell’usare l’iterazione utilizzando una delle istruzioni del bucle. Nel seguente codice di esempio, abbiamo implementato un cicli while
che accumula i valori moltiplicati in una variabile e restituisce l’intero risultante per valore al chiamante. Notare che il bucle decrementa il numero in ogni bucle e l’espressione n--
viene utilizzata per memorizzare il valore prima che venga decrementato.
#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;
}
Produzione:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800,
Usa il metodo ricorsivo per calcolare il fattoriale di un numero
Un’altra soluzione è impiegare chiamate di funzioni ricorsive per il calcolo fattoriale. La ricorsione è la caratteristica della funzione di richiamare se stessa dal proprio corpo. La parte principale della funzione ricorsiva consiste nel definire una condizione che assicuri che ritorni al chiamante e non venga trascinato in un comportamento in stile bucle infinito. In questo caso, specifichiamo la condizione if
per indicare lo stato in cui deve essere effettuata la chiamata ricorsiva. Altrimenti, la funzione dovrebbe restituire 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;
}
Produzione:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800,
In alternativa, possiamo unire la funzione ricorsiva in un’implementazione di una riga in cui l’espressione ?:
Valuta se il numero dato è uguale a 0
o 1
, nel qual caso la funzione restituisce 1
. Se la condizione è falsa, viene eseguita la chiamata ricorsiva e continua con il nuovo stack frame della funzione finché la condizione non è vera. Il codice di esempio restituisce il fattoriale di ogni elemento nel vettore
dichiarato.
#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;
}
Produzione:
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