Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.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 从Crockford';书_Javascript_Memoization - Fatal编程技术网

Javascript 从Crockford';书

Javascript 从Crockford';书,javascript,memoization,Javascript,Memoization,示例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; }; retu

示例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;
}();
  
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);
});
示例2。

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;
}();
  
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书中的两段代码片段,用于演示记忆化的概念

问题1。如何从两个示例中调用函数fibonacci?通常的方法是斐波那契(5)

问题2。正如我所看到的,在调用var fib=function(n){var shell=function(n){时,参数“n”在任何地方都没有定义。 在fibonacci函数的第一个示例中,我希望在第二行var memo=[0,1];之后定义“n”,并且我希望“n”的定义如下:n=arguments[0];。 然而,由于情况似乎并非如此,所以我不得不问:当调用斐波那契时,“n”是如何确定的

谢谢

问题1:我如何称呼每个人? 第一个示例,请注意结尾处的
}()
。这是调用函数,然后返回
fib
函数。因此第一个示例中的
fibonacci()
实际上是
fib()
,带有自己的内部引用(例如
memo
fib
),
memo
仅可由
fib
访问,但只要存在对
fib
的引用,则作为引用持续(保存
fibonacci
返回的变量)

第二个示例与此类似,只是它替换了一个接受项目数组并返回
shell
的回忆录,该回忆录可以访问所传递的数组

问题2:
n
作为参数在做什么? 由于在调用
fibonacci
函数时,实际上调用的是对内部创建但外部可用的
fib()
shell()
的引用,因此传递的是一个新的数字,然后将其fibonacci序列“记忆化”将其存储在开头给出的内部可用的
备忘录中



关键是,记忆就像一个散列存储,在这里可以访问已经知道的计算(因为它们以前被执行并“记忆”),防止重新计算,并使用Javascript的闭包结构允许您使用内部作用域变量来管理访问。

n是分配给变量
recur
的匿名函数的参数,因此它确实是定义的。您需要将重现问题所需的代码放在问题本身中,而不是放在链接中的图片中。不是吗如果其他人理解你,这很重要。这个问题不符合网站标准,需要进行适当编辑,否则它将被关闭。好的,给我几分钟时间编辑它。顺便说一下,我想知道,如果由于“网站标准”,没有人可以使用它,为什么图像附件选项可用?它用于非代码的东西。例如,如果你在网站或Java swing应用程序或GTK应用程序上工作,并且在开发过程中遇到视觉问题,那么你可以嵌入一个屏幕截图。但不要将其用于代码或其他文本数据,如stacktraces。我已取消投票以结束你的问题,谢谢你的编辑。嗨,Jared。从你的答案来看,现在还不清楚,我如何调用这两个函数来获取fibonacci(100)或fibonacci(200)的数字未定义,而用于存储值的哈希显然是有限的,必须有某种方法在某个点停止计算。
n
是一个参数,它是您正在引用的
100
200
。因为
fibonacci
实际上是对其他地方定义的另一个函数的引用,在第一个实例只是为您提供将要使用的实际函数。请尝试:
let foo=(a)=>(b)=>console.log(a,b)
let bar=foo(1)
bar(2)
提供:
12
明白了。谢谢。