memoization(记忆化)
核心理念:减少工作量,避免重复工作,通过模拟缓存技术保存之前的计算结果供后续使用,多用于递归算法中。
示例
下面是一个常见的递归函数--计算阶乘
let factorial = (n) => {
if(n=0){
return 1;
}else{
return n * factorial(n-1);
}
}
考虑代码中遇到如下实现
let fact6 = factorial(6);
let fact5 = factorial(5);
let fact4 = factorial(4);
在以上代码执行过程中,递归函数被调用了18次,用于计算每一次的阶乘结果,然而在计算出 fact6 这个变量的过程中 fact5, fact4 都已经计算过了,如果在计算过程中缓存下每次调用的结果,后面的11次调用就可以缩减为两次,减少了很多的重复计算,根据这个思路,就可以对递归函数进行优化,加入缓存功能。
代码实现如下(留疑:0的阶乘是多少)
let factorial = (n) => {
factorial.cache = {
'0': 0,
'1': 1
}
if(!factorial.cache.hasOwnproperty(n)){
factorial.cache[n] = n * factorial(n-1);
}
return factorial.cache[n];
}
推荐相关文章
http://www.imooc.com/article/277705?block_id=tuijian_wz
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。