C++ で数値の階乗を計算する

胡金庫 2023年10月12日
  1. C++ で反復法を使用して数値の階乗を計算する
  2. 再帰的方法を使用して数値の階乗を計算する
C++ で数値の階乗を計算する

この記事では、C++ で数値の階乗を計算する方法のいくつかの方法について説明します。

C++ で反復法を使用して数値の階乗を計算する

数の階乗は、1 から始まり、指定された数を含むすべての整数を乗算することによって計算されます。単純なアルゴリズムは、ループステートメントの 1つを使用して反復を使用することであることに注意してください。次のサンプルコードでは、乗算された値を変数に累積し、結果の整数を値ごとに呼び出し元に返す while ループを実装しました。ループは各サイクルで数値をデクリメントし、n-- 式を使用して、デクリメントされる前に値を格納することに注意してください。

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

出力:

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

再帰的方法を使用して数値の階乗を計算する

別の解決策は、階乗計算に再帰関数呼び出しを使用することです。再帰は、本体から自分自身を呼び出す関数の機能です。再帰関数の主要部分は、呼び出し元に戻り、無限ループスタイルの動作に引き込まれないようにする条件を定義することです。この場合、再帰呼び出しを行う必要がある状態を示すために、if 条件を指定します。それ以外の場合、関数は 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;
}

出力:

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

または、再帰関数をワンライナー実装にマージすることもできます。この場合、?:式は、指定された数値が 0 または 1 に等しいかどうかを評価します。この場合、関数は 1 を返します。条件が false の場合、再帰呼び出しが行われ、条件が true になるまで新しい関数スタックフレームが続行されます。サンプルコードは、宣言されたベクトルの各要素の階乗を出力します。

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

出力:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800,
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Math