Большое спасибо за ваши ответы. Просто короткая заметка, чтобы поделиться моими выводами при изучении ваших предложений (я не профессиональный программист):
Итак, я проверил мемоизацию (концепция, о которой я не знал), но обнаружил, что она не является поточно-ориентированной "как таковой" (т.е. об этом нужно заботиться отдельно) и, исходя из того, видно, это имеет некоторые другие последствия при его реализации.
Итак, я решил продолжить свой первый подход и посмотреть, смогу ли я сделать его поточно-ориентированным. К счастью, я нашел этот «ConcurrentDictionary» в .NET 4.0:
http://msdn.microsoft.com/en-us/library/dd287191(VS.100).aspx
[В 4.0 есть и другие параллельные контейнеры.]
Итак, я придумал эту модифицированную версию, которая по-прежнему опирается на (возможно, статическое) поле области классов для кэша, но, как мне кажется, имеет меньше ограничений и последствий реализации, чем запомненная версия:
public class Foo
{
private static ConcurrentDictionary<uint, double> _factorialCache;
public Foo()
{
if (_factorialCache == null)
_factorialCache = new ConcurrentDictionary<uint, double>();
}
public double Factorial(uint inputValue)
{
double returnValue = 0;
if (inputValue < 2) return 1;
if (_factorialCache.TryGetValue(inputValue, out returnValue))
return returnValue;
returnValue = inputValue * Factorial(inputValue - 1);
if (!_factorialCache.TryAdd(inputValue, returnValue))
throw new Exception("Failed to add factorial value to the factorial cache.");
return returnValue;
}
}
Я очень доволен этой версией сейчас, но любые предложения по улучшению приветствуются.
Большое спасибо,
d.
PS - Как пометить вопрос как "решенный"?