在 JavaScript 中实现自动记忆(返回闭包函数)

2023-12-06

我读了

http://www.sitepoint.com/implementing-memoization-in-javascript/

自动记忆

在前面的所有示例中,函数都经过显式修改以添加记忆功能。也可以在不修改功能的情况下实现记忆化基础设施。这很有用,因为它允许功能逻辑与记忆逻辑分开实现。这是通过创建一个实用函数来完成的,该函数将函数作为输入并对它应用记忆。以下 memoize() 函数采用函数“func”作为输入。 memoize() 返回一个新函数,它围绕“func”包装了缓存机制。请注意,此函数不处理对象参数。为了处理对象,需要一个循环来单独检查每个参数并根据需要进行字符串化。

function memoize(func) {
  var memo = {};
  var slice = Array.prototype.slice;

  return function() {
    var args = slice.call(arguments);

    if (args in memo)
      return memo[args];
    else
      return (memo[args] = func.apply(this, args));

  }
}

用这个,我做了

var fib = function(n)
{
  if (n <= 1)
  {
    return 1; // as the Fib definition in Math
  }
  else
  {
    return fib(n - 2) + fib(n - 1); // as the Fib definition in Math
  }
};

log(memoize(fib)(43));
log(fib(43));

不过,我确认没有效果。

我也出于同样的目的尝试了 npm 库,

https://github.com/medikoo/memoize

and

var memoize = require('memoizee');

log(memoize(fib)(43));
log(fib(43));

结果,一样。

我错过了什么,如何修复并使其发挥作用?

Thanks!

EDIT

require('memoizee');

var fib = function(n)
{
  if (n <= 1)
  {
    return 1; // as the Fib definition in Math
  }
  else
  {
    return fib(n - 2) + fib(n - 1); // as the Fib definition in Math
  }
};

var generator = function(f)
{
  return memoize(f);
};

var _fib = generator(fib);
console.log(_fib(40)); //no effect

The memoize调用不会改变fib函数,但返回其新的、已记忆的对应项。在您的代码中,您只调用该函数一次,而原始的fib下次再发挥作用。你需要创建one记住“包装器”,然后称之为multiple times:

var mFib = memoize(fib);
log(mFib(43));
log(mFib(43));

也可以覆盖原来的fib = memoize(fib);,这还有一个额外的好处,即递归调用(这是有趣的调用)也将被记忆。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 JavaScript 中实现自动记忆(返回闭包函数) 的相关文章

随机推荐

  • Drupal 7 Views - 按字段列出组

    我有一个列出类型内容的视图Bio 人物传记 但是 我想对其进行格式化 以便将它们分组在不同的标题下 我添加了一个新字段Bios内容类型是一个包含三个不同选项的下拉列表 Foo Bar and Baz 我想做的是将人员显示在各自组的标题下 现
  • 当视图使用主布局时,MVC 4 \ 表单提交按钮不起作用

    ok 经过长时间的调查 似乎当我创建一个与 layout cshtml 一起使用的视图时 我所拥有的表单中的提交按钮不起作用 没有任何操作返回到控制器 仅当我创建视图并取消选中 使用布局或母版页 时 该按钮才起作用 这看起来非常不清楚 所以
  • 如何使用 Spring RestTemplate 将列表或字符串数​​组传递给 getForObject

    我正在用 Spring 开发一些宁静的服务 我在将字符串数组或大字符串作为参数传递 获取到服务控制器时遇到问题 我的代码示例如下 控制器 RequestMapping value getLocationInformations pointL
  • HttpClient 订阅的响应标头未定义

    谁能告诉我为什么在从 http post 获取响应时没有收到任何标头的原因 this http post
  • 版本 5.5.4+ 中的 ItextSharp 字体颜色问题

    我有一些代码使用红色字体颜色创建红色 图章 string StampDate DateTime Now ToString MM dd yyyy string FontPath Server MapPath assets Fonts stri
  • 使用 Hadoop 版本 2.7.2 从 Spark 使用 S3a 协议访问 S3

    我正在尝试从 pyspark 版本 2 2 0 访问 s3 s3a 协议 但遇到了一些困难 我正在使用 Hadoop 和 AWS sdk 软件包 pyspark packages com amazonaws aws java sdk pom
  • OSMDroid:onTap 示例

    几周前我开始学习 Android 现在我需要你的帮助 我的任务是创建离线地图 使用 OSMDroid 和 Mobile Atlas Creator 上面有两个标记 它们之间的路径以及单击此标记后的一些活动 我已经做好了地图 标记和路径 这是
  • 如果缓存文件夹中不存在文件,则重写 htaccess

    我想检查缓存文件夹中是否不存在文件 然后将其重新连接到 php 文件 RewriteCond DOCUMENT ROOT cache 0 f NC RewriteRule jpg png gif css js include cache o
  • geodjango中按距离排序的效率如何(整个表)

    假设我有以下数据模型 Person models Model id models BigAutoField primary key True name models CharField max length 50 location mode
  • minSDK 低于 11 的 Android 设备上的 Google 地图 v2

    当我创建使用 Google 地图 API v2 的项目时 我遇到了这一行的问题 GoogleMap 地图 MapFragment getFragmentManager findFragmentById R id map getMap 据说我
  • ObjectListView 显示图标

    尝试将图标放入 ObjectListview 中 这是我应该放置图标的代码 objectListView1 SmallImageList imageList1 deleteColumn IsEditable true deleteColum
  • 使用 extjs 4 嵌套网格

    我可以将网格放入另一个网格的插件中 这是我的网格 我想放入配置 插件 扩展网格 var grid new Ext grid GridPanel store store columns header Customer Name dataInd
  • 是否可以在javascript中取消打印

    我正在使用这里找到的代码 检测浏览器打印事件检测用户是否想要打印该页面 到目前为止 它按预期工作 在 afterPrint 函数中 我调用一个函数 该函数创建并附加一个 iframe 其中包含另一个页面 该页面具有不同的 对需要打印的内容更
  • scanf 跳过所有直到出现字符串

    是否可以使用 scanf 跳过所有字符 直到到达特定字符串 我有一个 html 文件 我想跳过此字符串之前的所有字符 包括该字符串 h2 a href a href a a h2
  • 压缩阻塞文件中的记录的好算法是什么?

    假设您有一个由一堆固定大小的块组成的大文件 每个块都包含一定数量的可变大小的记录 每条记录必须完全适合单个块 并且根据定义 此类记录永远不会大于整个块 随着时间的推移 随着记录从这个 数据库 中移入和移出 记录会被添加到这些块中或从这些块中
  • G1GC 日志中的时间

    我读过 G1GC 日志中打印的一些不同时间的描述 但无法真正证明 理解当我在本地生成它们时 例如 以下日志是在我的 Java 11 电脑上生成的 我想知道 第一行的 0 500 毫秒与第二行的 0 01 秒有什么区别 应用程序是否暂停 由于
  • 如何在DRF中通过一个请求创建多个对象(相关)?

    我有一个类代表一个作业 一个类代表一个标签 它描述了一个作业 然后我有一个类在它们之间建立了关系 联结表 因此一个作业可以由多个标签来描述 class JobTag models Model job models ForeignKey Jo
  • 使用每月的第一个交易日将每日 Pandas 股票数据转换为每月数据

    我在 pandas 数据框中有一组计算的 OHLCVA 每日证券数据 如下所示 gt gt gt type data dy
  • 如何在 AutoHotkey 中每次目标窗口变为活动状态时激活功能

    我想在每次切换到特定程序时激活声音配置文件 并在每次离开时更改回默认配置文件 此操作通过单选按钮在 GUI 中打开 我创建的解决方法是 Auto Ftsps gui Submit NoHide While Rad3 1 Previous w
  • 在 JavaScript 中实现自动记忆(返回闭包函数)

    我读了 http www sitepoint com implementing memoization in javascript 自动记忆 在前面的所有示例中 函数都经过显式修改以添加记忆功能 也可以在不修改功能的情况下实现记忆化基础设施