Хорошо, поэтому в C # я мог бы написать:
public class Memorizer<K,TRes>
{
private Dictionary<K,TRes> _mem;
private Func<K,TRes> _function
public Memorizer (Func<K,TRes> function)
{
_function = function;
_mem= new Dictionary<K,TRes>();
}
public TRes Call(K arg)
{
if (mem.ContainsKey(arg)
{
return _mem[arg];
}
else
{
TRes ret=_function(arg);
_mem[arg] = ret;
return ret;
}
}
}
Что можно использовать для получения очевидных выгод:
public class FactorialCalculator()
{
private Memorizer<ushort, ulong> _memorizedFactorial;
public FactorialCalculator()
{
_memorizedFactorial = new Memorizer<ushort, ulong> (innerFactorial);
}
private ulong innerFactorial(ushort x)
{
return (x=0) ? 1 : x*Factorial(x-1)
}
public ulong factorial(ushort x)
{
_memorizedFactorial.Call(x);
}
}
Я уверен, что это можно сделать более общим и элегантным.
И я знаю, что у меня будут исключения переполнения, если x> 20.
(И у меня там тоже могут быть ошибки типов)
Но, надеюсь, я высказал свою точку зрения: я могу создать класс, который может удовлетворить потребности в запоминании чисто математических функций (т.е. детерминированных, не имеющих побочных эффектов функций)
и получите замечательный прирост производительности.
Как я могу сделать подобное в Java?