【发布时间】:2012-01-03 22:35:10
【问题描述】:
好的,所以我可以用 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 中完成类似的事情?
【问题讨论】:
-
我相信这些被称为“memoizer”,而不是“memorizer”。
-
也是Dictionary,而不是"new Dictionairy"行中的Dictionairy。
-
此外,基于素因数分解计算阶乘效率更高。对于每个素数 p
-
@Mike,这只是一个例子。证明一个观点。
标签: c# java performance function memoization