確定的な関数の計算結果をキャッシングするデコレータを作成します(単純に1つの引数の関数を仮定します)。一般的な場合にはJS:再帰関数をキャッシュで装飾できますか?
は、この方法を行うことができている:origFunc
が再帰的であるとき
function makeCacheable(origFunc){
let registry = {};
return function (a){
if (a in registry){
return registry[a];
}
let res = origFunc(a);
registry[a] = res;
return res;
}
}
問題が表示されます:唯一のトップレベルの呼び出しはラッピングキャッシュを経るが、再帰呼び出しスタックの残りの部分はしていませんキャッシュを満たしている。これがなぜ起こるのか説明する必要はありません。 は、同じ方法でキャッシュ可能な再帰関数を作る自然な方法ですか??
function fibonacciF(n) {
if (n <= 2) return 1;
let a = 1, b = 1;
for (let i = 2; i < n; ++i){
[a, b] = [b, a+b];
}
return b;
}
function fibonacciR(n) {
return n <= 2 ? 1 : (fibonacciR(n-1) + fibonacciR(n-2));
}
let fiboF = makeCacheable(fibonacciF); // OK
let fiboR = makeCacheable(fibonacciR); // actually is not what expected