好了,所以在C#中我可以這樣寫:記憶化在Java中
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,會出現溢出異常。 (我可能已經在那裏強制轉換的錯誤太) 但我希望我做了我的觀點:我可以創建一個類,它可以furful爲純數學函數memoisation需求(即確定的,無副作用的功能) 並獲得精彩性能提升。
我該如何在Java中完成類似的事情?
我相信,這些被稱爲「memoizer」,而不是「存儲器」。 – Oded
另外* *詞典*,不* Dictionairy *在*「新Dictionairy」*線。 – TacticalCoder
另外,根據素因子分解計算factorial效率更高。對於每個素數p <= n,其出現的次數爲n的一個因子!對於自然數i,就像sum(i * floor(n/pow(p,i)))。 –