【问题标题】:Memoization in Javascript from Crockford's bookCrockford 书中的 Javascript 中的记忆
【发布时间】:2021-02-26 14:15:59
【问题描述】:

示例 1.

var fibonacci = function () {
  var memo = [0, 1];
  var fib = function (n) {
    var result = memo[n];

    if (typeof result !== 'number') {
      result = fib(n - 1) + fib(n - 2);
      memo[n] = result;
    }

    return result;
  };

  return fib;
}();
  

示例 2。

var memoizer = function (memo, fundamental) {
  var shell = function (n) {
    var result = memo[n];

    if (typeof result !== 'number') {
      result = fundamental(shell, n);
      memo[n] = result;
    }

    return result;
  };

  return shell;
};

var fibonacci = memoizer([0, 1], function (shell, n) {
  return shell(n - 1) + shell(n - 2);
});

以上是 Crockford 书中的 2 个代码 sn-ps,用于演示记忆的概念。

问题 1. 如何从 2 个示例中的任何一个调用 fibonacci 函数?按照惯例斐波那契 (5)

问题 2. 如我所见,在调用 var fib = function (n) { 时,没有在任何地方定义参数“n” var shell = 函数 (n) {. 在斐波那契函数的第一个示例中,我希望在第二行 var memo = [0, 1]; 之后立即定义“n”,并且我希望定义“n”如下:n = arguments[0];。 但是既然情况似乎不是这样,所以我不得不问:当调用斐波那契时,“n”是如何确定的?

谢谢。

Page from Crockford's books

【问题讨论】:

  • n是赋值给变量recur的匿名函数的参数,所以确实是定义的。您需要将重现问题所需的代码放在问题本身中,而不是放在链接中的图片中。别人是否理解你并不重要。此问题不符合网站标准,需要进行适当编辑,否则将被关闭。
  • 好的,给我几分钟编辑一下
  • 顺便问一下,如果由于“站点标准”而没有人可以使用图像附件选项,为什么可以使用它?
  • 它适用于非代码的东西。例如,如果您正在开发网站、Java swing 应用程序或 GTK 应用程序或其他任何东西,并且您在开发它时遇到视觉问题,那么您可以嵌入屏幕截图。但不要将它用于代码或其他文本数据,如堆栈跟踪。我已取消投票以结束您的问题,感谢您对其进行编辑。

标签: javascript memoization


【解决方案1】:

问题 1:如何称呼每个人?

第一个例子,注意最后的}()。这是调用该函数,该函数又返回fib 函数。因此,第一个示例中的 fibonacci() 实际上是 fib(),具有自己的内部引用(例如 memofib),memo 只能由 fib 访问,但只要引用fib 存在(持有fibonacci 的返回值的变量)。

第二个例子类似,只是它替换了一个接受项目数组并返回shell的记忆器,它可以访问它传递的数组。

问题 2:n 作为参数在做什么?

当您调用fibonacci 函数时,您实际上是在调用对内部创建但外部可用的fib()shell() 的引用,因此您传入了一个新数字,该数字具有斐波那契数列” memoized" 通过将其存储在开头给出的内部可用memo 中。


关键是 memoization 就像一个哈希存储,其中可以访问已知的计算(因为它们之前已执行并且“memoized”)(防止重新计算),并且使用 Javascript 的闭包构造允许您使用内部范围的变量管理该访问权限。

【讨论】:

  • 嗨,杰瑞德。从您的回答中仍不清楚,我如何调用这两个函数来获取斐波那契(100)或斐波那契(200)的数字。由于“n”是未定义的,而用于存储值的散列显然是有限的,所以必须有某种方法在某个时候停止计算..
  • n 是您引用的 100200 的参数。因为fibonacci 实际上是对在别处定义的另一个函数的引用,所以在第一个实例中定义的函数只是为您提供了您将使用回来的实际函数。 jsfiddle.net/Lsxbjymw
  • 尝试:let foo = (a) => (b) => console.log(a, b) let bar = foo(1) bar(2) 给予:1 2
  • 知道了。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多