从开通博客到目前为止,也有一年了,刚开始的写了一篇工作的感想,然后就一直不知道写什么,看园子里的文章实在是很专业,怕自己写的太水。但是,写一些东西总归是好的,于是就当作是记笔记一样,开始写第一篇技术类的文章。

最近打算巩固加强javascript知识,所以开始做codewars, 通过解决codewars的kata,真的了解了一些没有注意的知识点。最近就了解了一下,以前没有听过的memoization.

codewars的题目是这样写的:

给一个整数n,写一个函数返回fibonacci数列的第n个数,并且不希望执行函数后还要去泡杯咖啡来等待结果~囧~,然后提出了'implement the memoization solution'。由于之前没有听说过memoization,所以就去google了一下了解到底什么是memoization。

一  memoization简介

维基百科是这样描述的:

memoization最初是用来优化计算机程序使之计算的更快的技术,是通过存储调用函数的结果并且在同样参数传进来的时候返回结果。大部分应该是在递归函数中使用。

memoization这个词是在1968年被Donald Michie创造出来的,它源于拉丁语memoradum,在英语中通常简写为memo,因此就有了将一个函数的返回结果暂存入某个变量中的意思。(翻译水平略渣,如有不对,欢迎指正拍砖)。

二  通过Fibonacci例子进一步了解

一般实现输出fibonacci数列第n个数,应该使用递归调用,代码是这样的:

function fibonacci(n){
if(n==0||n==1){
return n;
}
return fibonacci(n-1) + fibonacci(n-1);
}

由于递归函数会重复调用很多遍函数,传入同样的参数,得到同样的结果,实际是重复实现同一个行为,就会导致效率很低。比如执行fibonacci(5),就要先算出fibonacci(4)和fibonacci(3);而计算fibonacci(4)和fibonacci(3),就要计算fibonacci(3),fibonacci(2)和fibonacci(2),fibonacci(1),这就像一个树一样,每个分支都要重复计算,直到得到fibonacci(1)为止。如下图所示: 

这样就会导致需要计算很多遍的重复数据,于是想到是否能够把已经计算过的结果暂时存起来,等到下次用的时候直接取出结果。所以定义了一个数组用来存放计算过的数据,然后在需要的时候从数组中查询,这样就会省去不需要的计算,提高程序的效率。代码如下:

var fibonacci = (function(){
var cache = [];           //定义一个空的存放缓存的数组
return function(n){      
if(n === 0 || n === 1){
return n;
}else{
cache[n-1] = cache[n-1]||fibonacci(n-1); //先从cache数组里查询结果,如果没找到的话在计算
cache[n-2] = cache[n-2]||fibonacci(n-2);
return cache[n-1]+cache[n-2];
}
}
})();

三 总结

memorization 可以把函数每次的返回值存在一个数组或者对象中,在接下来的计算中可以直接读取已经计算过并且返回的数据,不用重复多次相同的计算。这种方法可用于部分递归中以提高递归的效率。

最后,本文如果有任何有问题的地方,欢迎批评指正。

memoization提升递归效率的更多相关文章

  1. 提升JavaScript递归效率:Memoization技术详解[转载]

    递归是拖慢脚本运行速度的大敌之一,太多的递归会让浏览器变得越来越慢直到死掉或者莫名其妙的突然自动退出.这里我们可以通过memoization技术来替代函数中太多的递归调用,提升JavaScript效率 ...

  2. atitit.提升开发效率---使用服务器控件生命周期 asp.net 11个阶段 java jsf 的6个阶段比较

    atitit.提升开发效率---使用服务器控件生命周期  asp.net 11个阶段  java jsf 的6个阶段比较 如下列举了服务器控件生命周期所要经历的11个阶段. (1)初始化-- --在此 ...

  3. Atitit. 提升开发效率与质量DSL ( 3) ----实现DSL的方式总结

    Atitit. 提升开发效率与质量DSL ( 3) ----实现DSL的方式总结 1. 管道抽象 1 2. 层次结构抽象(json,xml etc) 1 3. 异步抽象promise 1 4. Ide ...

  4. atitit.提升开发效率---MDA 软件开发方式的革命(3)----自动化建表

    atitit.提升开发效率---MDA 软件开发方式的革命(3)----自动化建表 1. 建模在后自动建表 1 1. 传统上,需要首先建表,在业务编码.. 1 2. 模型驱动建表---更多简化法是在建 ...

  5. atitit.提升开发效率---mda 软件开发方式的革命--(2)

    atitit.提升开发效率---mda 软件开发方式的革命--(2) 1. 一个完整的MDA规范包含: 1 2. 一个完整的MDA应用程序包含: 1 3. MDA能够带来的最大的三个好处是什么? 2 ...

  6. atitit.提升开发效率---mda 软件开发方式的革命

    atitit.提升开发效率---mda 软件开发方式的革命 1. 软件开发方式的革命开发工具的抽象层次将再次提升 1 2. 应用框架和其实现相分离 2 3. 目前的问题模型和代码不同步 2 4. MD ...

  7. atitit.提升开发效率---动态语言总结

    atitit.提升开发效率---动态语言总结 ruby,python 都不错,就是语法不好, 应用不广泛,文档,工具都非常少,不推荐... php狠不错,就是高级特性不行.. 看来子有.net/jav ...

  8. synergy帮组提升办公效率

    这个synergy确实很不错哦,当你在办公室拥有两台或者多台电脑的时候,放在面前多台显示器,多个鼠标,多个键盘,但是你的桌面上,是不是多出了些你不需要看到的键盘或者鼠标?至少我是这样子的,我希望多个显 ...

  9. atitit.提升研发效率的利器---重型框架与类库的差别与设计原则

    atitit.提升研发效率的利器---重型框架与类库的差别与设计原则 1. 框架的意义---设计的复用 1 1.1. 重型框架就是it界的重武器. 1 2. 框架 VS. 库 可视化图形化 1 2.1 ...

随机推荐

  1. Jsoup的简易使用示例

    http://www.open-open.com/jsoup/parsing-a-document.htm 测试用网页 <!doctype html> <!-- http://jwc ...

  2. Android如何实现茄子快传

    Android如何实现茄子快传茄子快传是一款文件传输应用,相信大家都很熟悉这款应用,应该很多人用过用来文件的传输.它有两个核心的功能: 端到端的文件传输Web端的文件传输这两个核心的功能我们具体来分析 ...

  3. MUI框架开发HTML5手机APP(二)--页面跳转传值&底部选项卡切换

      概 述 JRedu 在上一篇博客中,我们学习了如何使用Hbuilder创建一个APP,同时如何使用MUI搭建属于自己的第一款APP,没有学习的同学可以戳链接学习: http://www.cnblo ...

  4. Docker permission denied while trying to connect to the Docker daemon socket

    Problem jenkins执行docker打包的时候报错,说没有权限 docker build -t docker.ryan-miao.com/com.demo:f1aa23e --build-a ...

  5. idea插件actiBPM源码

    actiBPM https://github.com/Activiti/Activiti

  6. git强制提交本地分支覆盖远程分支

    git push origin 分支名 --force eg: cd 代码目录 git push origin master --force 运行结果: Total 0 (delta 0), reus ...

  7. ionic BUILD FAILED

    BUILD FAILED Total time: 24.572 secs FAILURE: Build failed with an exception. What went wrong: Execu ...

  8. logback配置异步日志

    <appender name="FILE" class= "ch.qos.logback.core.rolling.RollingFileAppender" ...

  9. 安装最新版RabbitMQ v3.7.13 以及基本配置

    之前用的老版本,新项目新气象,RabbitMQ也用最新版吧 首先打开官网:http://www.rabbitmq.com/install-rpm.html 先到右侧导航栏来看一下 : 第一个红框是指的 ...

  10. [k8s]debug模式启动集群&k8s常见报错集合(on the fly)

    debug模式启动-支持sa 集群内(pod访问api)使用443加密 no1 no2 安装flanneld kubelet/kube-proxy m1 安装etcd/ api/contruller/ ...