我已經編寫了代碼來返回計算一系列整數的Func<int, long>
。我想以最優雅的方式緩存中間結果。目前我的代碼看起來是這樣的:在C#中,我可以將Func包裝爲緩存結果
private static Func<int, long> A237585() {
Func<int, long> A = null;
Func<int, long> B = null;
Func<int, long> C = null;
A = CreateCachingFunc((n) => n == 0 ? 0 : B(n-1));
B = CreateCachingFunc((n) => C(n) + (n == 1 ? 1 : 0));
C = CreateCachingFunc(CreateSumProductPartitionSelect(A, (n, k) => Choose(n + k - 1, k)));
return A;
}
private static Func<int, long> CreateCachingFunc(Func<int, long> original)
{
var cache = new List<long>();
Func<int, long> cachedVersion = (n) =>
{
while (n >= cache.Count) cache.Add(original(cache.Count));
return cache[n];
};
return cachedVersion;
}
我想它是這個樣子:
private static Func<int, long> A237585() {
CachedFunc<long> A = null;
CachedFunc<long> B = null;
CachedFunc<long> C = null;
A = (n) => n == 0 ? 0 : B(n-1);
B = (n) => C(n) + (n == 1 ? 1 : 0);
C = CreateSumProductPartitionSelect(A, (n, k) => Choose(n + k - 1, k));
return A;
}
這可能嗎?我如何編寫CachedFunc在返回時隱式地將CachedFunc轉換回Func,並隱式地將匿名lambdas轉換(包裝)爲緩存版本?如果不可能,最好的方式來包裝我的功能?我希望頂級代碼看起來儘可能簡單。
這是某種家務?你的代碼有什麼問題?你如何衡量「最優雅」和「儘可能簡單」? – JeffRSon
這被稱爲memoization。 – SLaks
我正在尋找新的有趣的序列添加到OEIS。這個是https://oeis.org/draft/A237585。總的來說,我希望爲主要描述提供一段非常簡單的代碼,其中包含指向其他實現的鏈接。 –