Calcola fattoriale di un numero in C++

Jinku Hu 12 ottobre 2023
  1. Usa il metodo iterativo per calcolare il fattoriale di un numero in C++
  2. Usa il metodo ricorsivo per calcolare il fattoriale di un numero
Calcola fattoriale di un numero in C++

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,
Autore: 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

Articolo correlato - C++ Math