これが私が持っているコードです:
===========================
public class Foo
{
//Class field to store factorial values as those are calculated
private static Dictionary<uint, double> _factorialCache;
public Foo()
{
_factorialCache = new Dictionary<uint, double>();
}
public double Factorial(uint inputValue)
{
if (inputValue < 2) return 1;
if (_factorialCache.ContainsKey(inputValue))
return _factorialCache[inputValue];
_factorialCache.Add(inputValue, (double)inputValue * Factorial(inputValue - 1));
return _factorialCache[inputValue];
}
}
===========================
数学的に言えば、これは機能します。興味深いことに、たとえば5の階乗が最初に計算された値である場合、キャッシュはこの計算中に2、3、4、および5の階乗を格納します(つまり、すべての「中間」階乗を格納します)。私の場合、同時に複数のFooクラスのインスタンスが存在することはありませんが、この例では、Fooの複数のインスタンスが同時に存在する可能性がある場合もカバーするために、辞書を静的として宣言することにしました。時間。
私の質問は次のとおりです。
これは、技術的な観点(スレッドセーフなど)から同じ値の階乗の再計算を回避するための最良の方法ですか?
以前に計算された値を格納するための(静的)クラススコープ変数の必要性を回避する他のアプローチ(たとえば、遅延評価などに関連するもの)はありますか?
すべての提案を歓迎します。
ありがとう、
d。