Javascript 从Crockford';书
示例1。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
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
明白了。谢谢。