私はそうのような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;
}
}
だから明確なもののこのタイプは、メモ化の恩恵を受けるだろう。私は最初にアルゴリズムを追加することを避けました。なぜなら、それは無関係であり、人々が私に提案を与える可能性が高いからです。それはポイントの横にあります。
おそらく 'var memoized = Memoize(theRecursiveMeth)'ですか? –
ええ、再帰的な呼び出しは、それを使用するつもりはありませんか? – dashnick
あなたが何を求めているのか分かりません。エラーメッセージは私にとっては非常にはっきりしているようで、許可されていないという明白な理由があります。とりわけ混乱させることは、メソッド名自体を再割り当てしようとするあなたの明白な試みと、すべての呼び出しで新しいキャッシュを作成するようなMemoize()の実装を覚えているので、暗記のメリットがなくなります。上記の最初のコメントの提案のようなものはうまくいくでしょうが(そしてあなたができることはすべてあります)、あなたの実際のシナリオにどのように適合するかを理解するのは混乱します。 –