memoize优化递归

function createRec(callback, cache) {
cache = cache || []; var rec = function(n) {
    (n in cache) || (cache[n] = callback(rec, n));
return cache[n];
}   return rec;
}

以Fibonacci数列为例子,如何创建一个优化的递归

var fib = createRec(function(cal, n) {
return cal(n - 1) + cal(n - 2);
}, [0, 1, 1]);

在callback里面我们传入的参数是返回的递归函数和n,函数体内部是递归函数遇到n后的递归规则,cache里面是一些初始值

作用

典型的,我们使用传统的递归计算Fibonacci数列

function fibonacci(n) {// author黄雪良
return n <= 2 ? 1 : fibonacci(n - 1) + fibonacci(n - 2);
}

计算fibonacci(80)……卡死了

但是使用经过优化的算法,可以非常快的算出来

原因很明显,由于缓存的原因1~80每个数都只需要计算一遍,80次计算需要的时间可不长,可是在没有缓存的情况下,每个数都需要重复计算很多遍

更进一步,尾递归

当然,我们还可以用尾递归进行优化

function fibonacci(n, ret1, ret2) {
if (n < 2) {
return ret1;
}
return fibonacci(n - 1, ret2, ret1 + ret2);
}

这个递归中,每次只有一个分支,很明显比原始的递归要优化了很多,而且每次递归都把结果计算出来了,每个数值只需要计算一遍

最新文章

  1. datetimepicker一个不错的日历android特效
  2. Hyper-v虚拟机文件VHDX与VHD的格式转换
  3. cmd chcp命令切换字符格式UTF8
  4. 两个viewport的故事(第二部分)
  5. 7——使用TextView实现跑马灯
  6. C语言栈的实现
  7. bootstrap 导航栏
  8. 关于css3中transform的理解(只是改变状态未改变其真正的属性)
  9. 通过web对.exe程序进行更新和修改
  10. MySQL_第三方数据库引擎_tokudb
  11. http/2.0与http/1.1的区别
  12. Vue的理解:Vue.js新手入门指南----转
  13. 初始Yarn
  14. effective c++ 笔记 (41-44)
  15. 【转】Git命令大全(非常齐全)
  16. [转] lua 获取本地当月天数
  17. restclient 访问 springmvc java工程接口
  18. 洛谷 P2951 [USACO09OPEN]捉迷藏Hide and Seek
  19. HTML5文本
  20. ssl证书之certbot

热门文章

  1. Redis——分布式简单使用
  2. json_decode详解
  3. iOS彩票项目--第七天,初次读取json数据、KVC转模型技巧、运行时字典转模型以及初步对显示网页的操作并且跟踪标签
  4. 【CodeForces 557B】Pasha and Tea
  5. oracle基本语句
  6. Mysql常出现的问题
  7. 36.Android之多线程和handle更新UI学习
  8. Aop 是面向切面编程,
  9. 【MVC5】ASP.NET MVC 项目笔记汇总
  10. 导入安全证书到jdk步骤详细说明-原