如何解决无法使用斐波那契解析备忘录设计模式
我不了解备忘录设计模式的最后步骤。这是我的经典斐波那契计算代码:
//Memoization
const fiboCache = () => {
const cache = [0,1];
const fibo = (x) => {
let result = cache[x];
if(typeof result !== 'number') {
console.log('new calculation for: ' + x);
result = fibo(x-1) + fibo(x-2);
cache[x] = result;
}
return result;
};
return fibo;
};
const getFibo = fiboCache();
console.log(getFibo(4));
对我来说,问题是最后一步,我试图将每次迭代细分如下:
4. result=undef; console.log; result=3; cache=[0,1,empty,3]
3. result=undef; console.log; result=2; cache=[0,2,3]
2. result=undef; console.log; result=1; cache=[0,3]
1. result=1; return 1;
我了解数组如何用作下一次计算的缓存,但是一旦我在上次迭代(1)上,我的result
对象就变成1,这破坏了我的递归,直接进入return result
。
这不是说我最后才返回1
吗?我不应该在这里返回数组的最后一项吗?
解决方法
这不是那么简单:您必须在每次递归返回时提高和降低递归级别。会像这样
- fibo(4),缓存= [0,1]-不在缓存中;从fibo(3)和fibo(2)计算
- fibo(3),缓存= [0,1]-不在缓存中;从fibo(2)和fibo(1)计算
- fibo(2),缓存= [0,1]-不在缓存中;从fibo(1)和fibo(0)计算
- fibo(1),缓存= [0,1]-从缓存中返回1
- fibo(0),缓存= [0,1]-从缓存返回0
返回到fibo(2):结果= fibo(1)+ fibo(0)= 1 + 0 = 1;写缓存[2] = 1,返回1
- fibo(2),缓存= [0,1]-不在缓存中;从fibo(1)和fibo(0)计算
- fibo(1),缓存= [0,1,1]-从缓存中返回1
返回至fibo(3):结果= fibo(2)+ fibo(1)= 1 + 1 = 2;写缓存[3] = 2,返回2
- fibo(3),缓存= [0,1]-不在缓存中;从fibo(2)和fibo(1)计算
- fibo(2),缓存= [0,2]-从缓存中返回1
即
- 每次递归都会将值返回到更高的级别,并且您会从顶级= 3获得结果,而不是您第一次想到的那样就按返回(1)
- 在每个递归级别完成后更新缓存;您将永远不会像原来那样以[0,1,empty,empty,3]结尾。
使用调试器逐步执行此操作并观察缓存内容和调用堆栈,可能也很有帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。