使用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()實現,因此否定了記憶的益處。類似於上面第一條評論中的建議可以很好地工作(並且您將能夠完成所有工作),但問題太混亂,無法理解這將如何適合您的實際情況。 –