【发布时间】:2016-10-24 09:01:58
【问题描述】:
我们将创建一个装饰器,缓存确定性函数的计算结果(为简单起见,我们假设一个参数函数)。
一般情况下可以这样做:
function makeCacheable(origFunc){
let registry = {};
return function (a){
if (a in registry){
return registry[a];
}
let res = origFunc(a);
registry[a] = res;
return res;
}
}
origFunc 递归时会出现问题:只有顶层调用通过包装缓存,而递归调用堆栈的其余部分不满足缓存。无需解释为什么会发生这种情况。我想知道是否有一种自然的方法可以使递归函数以相同的方式缓存?
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
【问题讨论】:
标签: javascript function caching recursion