整数内に収まる階乗の数は限られているため、最初の 20 個の値を手動で事前に計算し、それらをグローバル配列または静的配列に格納するだけです。次に、グローバル関数または静的関数を使用して、配列内の階乗を検索します。
#include <iostream>
const int factorials[] =
{
1,
1,
2,
6,
24,
// etc...
};
inline const int factorial(int n) {return factorials[n];}
int main()
{
static const int fourFactorial = factorial(4);
std::cout << "4! = " << fourFactorial << "\n";
}
への引数としてリテラルを使用する場合factorial
、コンパイラは単に関数呼び出しを結果に置き換える必要があります (最適化が有効になっている場合)。上記の例を XCode 4.4 (Mac 上) で試したところfourFactorial
、定数 24で初期化されるアセンブリが表示されます。
.loc 1 20 38 ## /Users/emile/Dev/sandbox/sandbox/main.cpp:20:38
movl $24, __ZZ4mainE13fourFactorial(%rip)
この方法は、再帰的なコンパイル時のトリックを使用するよりもコンパイルが高速になる場合があります。