memoized 函数
知道算法里的动态规划不?
动态规划 动态规划的基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解,其经过分解的子问题往往不是相互独立的
其解依赖于子问题
子问题的求解是重复的
采用重递归出现的大量重复运算
如 Fib 数列 采用动态规划方法
构造所有子问题的一个表格
采用自底向上的方法依次求解子问题
也可以采用自上而下,为避免重复运算,采用 备忘录 或称为 记忆递归
memoized
函数使得函数能够记住其计算结果,避免大量重复计算.
_.memoized = (fn,hasher) => {
//这里依旧利用闭包可以记录上下文的特性
const lookupTable = {};
return (key)=>{
//为了应对多个参数的情况,可接受传入hasher自定义对象的key
var address = hasher ? hasher.apply(this,arguments) : key;
return lookupTable[address] || (lookupTable[address] = fn(address));
}
}
示例:
let fc = _.memoized((n)=>{
if(n===0){
return 1;
}
return n*fc(n-1);
})
console.time(1)
console.log(fc(10));//3628800
console.timeEnd(1);//3.876ms
console.time(2);
console.log(fc(11));//39916800
console.timeEnd(2);//0.896ms
Last updated
Was this helpful?