首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >注解javascript

注解javascript
EN

Stack Overflow用户
提问于 2017-12-04 10:07:47
回答 1查看 780关注 0票数 1

我正在从“JavaScript JavaScript: Good Parts”一书中学习JavaScript,在回忆录部分中有一个关于使用回忆录技术解决斐波纳契问题的例子。

我们创建一个通用函数调用回忆器,它接受一个备忘录数组和基本函数,返回一个管理备忘录的shell函数,并调用基本函数。

代码语言:javascript
复制
 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;
};

然后像这样创建斐波纳契:

代码语言:javascript
复制
var fibonacci = memoizer([0, 1], function(shell, n) {
    return shell(n-1) + shell(n-2);
});

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

但让我困惑的是回忆录函数中的n参数shell函数。我知道这是我们想要计算的值。但它是从哪里来的?例如,如何调用fibonacci( 10 )可以将值10传递给n?法博纳契究竟是什么?它是函数还是指向函数对象作为回忆录?

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2017-12-04 10:54:06

因此,要完全理解这一点,你需要把下面的东西理解为基本的部分。

那么,现在看看代码。

var memoizer被赋值为返回内部另一个函数的函数。

代码语言:javascript
复制
var memoizer = function(memo, fundamental) {
  var shell = function(n) {
    ... do some works ...
  };
  return shell;
};

您看到了吗?var shellmemoizer行的末尾返回。

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

代码语言:javascript
复制
var fibonacci = memoizer([0, 1], function(shell, n) {
    return shell(n-1) + shell(n-2);
});

因此,它意味着fibonacci等于memoizer的结果(因为我们执行了它),而memoizer的结果等于shell函数。如果你能很好地阅读我给你的链接,你就能理解幕后发生了什么。

顺便说一下,你给出的代码不是最好的方法。因为无论如何,闭包使激活的对象处于活动状态,这是不必要的。

下面的代码是另一种制作fibonacci的方法,--这不是绝对最好的方法,不过,我建议您将这段代码与您的代码进行比较,并找出不同之处。

代码语言:javascript
复制
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));

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47630877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档