记忆javascript

问题描述 投票:0回答:1

我正在从JavaScript:The Good Parts一书中学习JavaScript,在memoization部分有一个关于使用memoize技术来做Fibonacci问题的例子

我们创建了一个通用的函数调用memoizer,它带有一个memo数组和基本函数,返回一个管理memo的shell函数并调用基本函数

 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);
});

如果我运行fibonacci(10),结果将准确显示。

但令我困惑的是memoizer函数中的n参数shell函数。我知道这是我们想要计算的价值。但它来自哪里?例如,调用fibonacci(10)如何将值10传递给n?什么是var fibonacci?它是一个函数还是指向函数对象作为memoizer?

谢谢你的帮助!

javascript memoization
1个回答
0
投票

因此,要充分理解这一点,您需要将以下内容理解为基本内容。

所以,现在看看代码。 var memoizer被指定为一个返回内部另一个函数的函数。

var memoizer = function(memo, fundamental) {
  var shell = function(n) {
    ... do some works ...
  };
  return shell;
};

你能看见它吗? var shellmemoizer的终点返回

无论memoizer的内在逻辑是什么,它的结果都分配给了var fibonacci

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

因此,这意味着fibonacci等于memoizer的结果(因为我们执行了它),而memoizer的结果等于shell函数。如果您阅读了我给您的链接,您可以了解幕后发生的事情。

顺便说一下,你给出的代码不是最好的方法。因为无论如何闭合使得激活的对象活着并不是必需的。

下面这段代码是制作斐波纳契的另一种方法,这不是绝对最好的方法,但是,我建议你将这段代码与你的代码进行比较,并找出差异。

var result = [];
result[0] = 1;
result[1] = 1;

function fibonacci(n){
    var i;
    
    for(i = 2; i < n; i++){
      if(!result[i]){
        result[i] = result[i-1] + result[i-2];
      }
    }
    return result[i-1];
}

console.log(fibonacci(10));
© www.soinside.com 2019 - 2024. All rights reserved.