使用Memoized方法我有一个memoizer功能,像这样:的递归函数
static Func<A, R> Memoize<A, R>(this Func<A, R> f)
{
var cache = new ConcurrentDictionary<A, R>();
return argument => cache.GetOrAdd(argument, f);
}
而且我也有一些递归方法
long TheRecursiveMeth (string inString) {
// recursive function that calls itself
}
现在,在我的主要功能,我尝试:
TheRecursiveMeth = TheRecursiveMeth.Memoize();
但编译器抱怨
'。'操作者可以不被施加到型方法组”的'操作数
和
赋值的左手侧必须是一个变量,属性或 索引器
我如何拨打TheRecursiveMeth
实际上拨打TheRecursiveMeth.Memoize()
,包括递归电话?
编辑:我试图避免编辑TheRecursiveMeth
的定义。很明显,我可以只检查字典。
编辑2:既然你有兴趣,我有一个函数来计算给定字符串的某些回文数。这里有点复杂,但基本上是这样的,但基本上类似于:
long palCount(string inString) {
if (inString.Length==1) return 1;
else {
count = 0;
foreach(substring of inString) {
// more complex logic here
count += palCount(subString);
}
return count;
}
}
很明显,这种类型的东西会受益于memoization。我首先避免添加算法,因为它是无关紧要的,并且更有可能让人们给我提出建议,这是不言而喻的。
也许'var memoized = Memoize(theRecursiveMeth)'? –
是的,但递归调用不会使用它,对吧? – dashnick
我不明白你在问什么。错误信息对我来说似乎很清楚,并且有明显的不被允许的原因。特别令人困惑的是,你明显尝试重新分配方法名称本身_以及似乎在每次调用时创建新缓存的Memoize()实现,因此否定了记忆的益处。类似于上面第一条评论中的建议可以很好地工作(并且您将能够完成所有工作),但问题太混乱,无法理解这将如何适合您的实际情况。 –