Faktorielle Berechnung einer Zahl in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden der iterativen Methode zur Berechnung der Fakultät einer Zahl in C++
  2. Verwenden Sie die rekursive Methode, um das Faktor einer Zahl zu berechnen
Faktorielle Berechnung einer Zahl in C++

In diesem Artikel werden verschiedene Methoden zur Berechnung der Fakultät einer Zahl in C++ erläutert.

Verwenden der iterativen Methode zur Berechnung der Fakultät einer Zahl in C++

Die Fakultät der Zahl wird berechnet, indem alle ganzen Zahlen beginnend mit eins multipliziert werden und die angegebene Zahl eingeschlossen wird. Beachten Sie, dass der einfache Algorithmus darin besteht, die Iteration mit einer der Schleifenanweisungen zu verwenden. Im folgenden Beispielcode haben wir eine while-Schleife implementiert, die die multiplizierten Werte in einer Variablen akkumuliert und die resultierende Ganzzahl nach Wert an den Aufrufer zurückgibt. Beachten Sie, dass die Schleife die Zahl in jedem Zyklus dekrementiert und der Ausdruck n-- verwendet wird, um den Wert zu speichern, bevor er dekrementiert wird.

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

Ausgabe:

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

Verwenden Sie die rekursive Methode, um das Faktor einer Zahl zu berechnen

Eine andere Lösung besteht darin, rekursive Funktionsaufrufe für die faktorielle Berechnung zu verwenden. Rekursion ist das Merkmal der Funktion, sich von ihrem Körper aus aufzurufen. Der Hauptteil der rekursiven Funktion besteht darin, eine Bedingung zu definieren, die sicherstellt, dass sie zum Aufrufer zurückkehrt und nicht in ein Verhalten im Stil einer Endlosschleife hineingezogen wird. In diesem Fall geben wir die Bedingung if an, um den Status anzugeben, in dem der rekursive Aufruf erfolgen soll. Andernfalls sollte die Funktion 1 zurückgeben.

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

Ausgabe:

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

Alternativ können wir die rekursive Funktion in einer einzeiligen Implementierung zusammenführen, in der der Ausdruck ?: Auswertet, ob die angegebene Zahl gleich 0 oder 1 ist. In diesem Fall gibt die Funktion die 1 zurück. Wenn die Bedingung falsch ist, wird der rekursive Aufruf ausgeführt und mit dem neuen Funktionsstapelrahmen fortgesetzt, bis die Bedingung erfüllt ist. Der Beispielcode gibt die Fakultät jedes Elements im deklarierten Vektor aus.

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

Ausgabe:

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

Verwandter Artikel - C++ Math