Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中实现自动记忆(返回一个closured函数)_Javascript_Node.js_Memoization - Fatal编程技术网

在JavaScript中实现自动记忆(返回一个closured函数)

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

我读过

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

用这个,我做到了

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));
结果是一样的

我错过了什么,以及如何修复和使其工作

谢谢

编辑
require('memoizee');
var fib=函数(n)
{

如果(n调用
memoize
不会改变
fib
函数,而是返回其新的、已记忆的对应函数。在您的代码中,您只调用一次该函数,下次调用原始的
fib
函数。您需要创建一个已记忆的“包装器”,并多次调用该函数:


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

调用
memoize
不会更改
fib
函数,但会返回其新的、已记忆的对应函数。在代码中,您只调用该函数一次,下次调用原始的
fib
函数。您需要创建一个已记忆的“包装器”,并多次调用该函数:


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

调用
memoize
不会更改
fib
函数,但会返回其新的、已记忆的对应函数。在代码中,您只调用该函数一次,下次调用原始的
fib
函数。您需要创建一个已记忆的“包装器”,并多次调用该函数:


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

调用
memoize
不会更改
fib
函数,但会返回其新的、已记忆的对应函数。在代码中,您只调用该函数一次,下次调用原始的
fib
函数。您需要创建一个已记忆的“包装器”,并多次调用该函数:



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

从您发布的内容来看,只有第一个调用使用了memoize-d函数。递归调用都使用原始的
fib
函数。哦,当然。我明白了。正在考虑如何修复。感谢您发布的内容,只有第一个调用使用了memoize-d函数。递归调用都使用原始的
fib
函数。哦当然。我明白了。思考如何修复。感谢您发布的内容仅第一次调用使用了memoize-d函数。递归调用都使用原始的
fib
函数。哦,当然。我明白了。思考如何修复。感谢您发布的内容仅第一次调用使用了memoize-d函数。递归调用都使用原始的
fib
函数Action.哦,当然。我明白了。正在考虑如何修复。谢谢。我喜欢过度编写的想法。通常,不建议在声明中这样做,但我的项目是用于此的库。所以我将使用。太好了,谢谢。因为您通常只需要手动将备忘录应用于特定函数,您也可以在声明中这样做:
var fib=memoize(函数(n){…fib(n-1)+fib(n-2)…})
谢谢。再想一想,在我的项目中,生成器函数实际上负责函数,在本例中为fib
,并完成其余的过程。因此,我不难在同一范围内编写代码来重写fib。如果可能的话,我希望避免在声明点中添加memoize。在这种情况下,你有什么想法吗?我知道w
下划线
按照您现在的建议执行,但我想知道是否有任何方法可以在生成器函数中隐藏它。否,如果无法访问该范围,则无法优化(的递归调用)通过备忘录实现功能。但是,如果你不能更改该模块,那么它似乎不是你的拿手好戏。询问负责该模块的开发人员。酷。我喜欢过度编写的想法。通常,不建议使用声明式编写,但我的项目是用于此的库。因此我将使用。太好了,谢谢。因为你通常需要手动创建一个只对特定函数应用memonisation,也可以在它们的声明中执行:
var fib=memonize(函数(n){…fib(n-1)+fib(n-2)…})
谢谢。再想一想,在我的项目中,生成器函数实际上负责函数,在本例中为fib,并完成其余的过程。因此,我不难在同一范围内编写代码来重写fib。如果可能的话,我希望避免在声明点中添加memoize。在这种情况下,你有什么想法吗?我知道w
下划线
按照您现在的建议执行,但我想知道是否有任何方法可以在生成器函数中隐藏它。否,如果无法访问该范围,则无法优化(的递归调用)通过备忘录实现功能。但是,如果你不能更改该模块,它似乎不是你喜欢的。询问负责它的开发人员。酷。我喜欢过度编写的想法。我们
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));
var memoize = require('memoizee');

log(memoize(fib)(43));
log(fib(43));
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
var mFib = memoize(fib);
log(mFib(43));
log(mFib(43));