【发布时间】:2016-10-30 11:45:16
【问题描述】:
我在使用此功能时遇到了多个问题。这是一门数据结构和算法课程的额外问题的一部分,我在这个问题上投入了很多时间,我真的很想让它工作并了解正在发生的事情。
有一个主要问题,导致了几个小问题……这个问题的名称是 JavaScript。我们以前从未使用过 JavaScript 编程,但出于某种原因,我们不得不使用它。
函数必须通过测试(这个和斐波那契),其结构如下:
var fn = (n) => 2 * n
var m_fn = memoize(fn)
expect(m_fn(18)).to.equal(fn(18))
所以我必须将我想要记忆的函数作为记忆函数的参数传递,记忆函数必须返回一个函数。我不允许以任何其他方式这样做。
我阅读并研究了 memoize 函数,但所有的实现都采用了不同的方法。
基本上,我了解我必须做什么,但我不太了解如何。我知道 memoize 函数应该做什么,但我不明白如何使用 memoize 函数调整原始函数。这是我目前拥有的/我没有的:
我知道这是错误的。但我想我错过了一些重要的东西。我应该返回一个函数,但我正在返回值...
在测试中,写的是 var m_fn = memoize(fn),所以 memoize 函数通过 fn,然后返回一个新函数,但是在我的 memoize 中,我正在返回 fn(n) 的值,所以我正在做一些事情错了……
/**
* Creates a memoized version of the function fn. It is assumed that fn is a referentially transparent
* function.
* @param {function} fn Some referentially transparent function that takes a basic datatype (i.e. number / string)
* @returns {function} A new function that is the memoized version of fn. It never calculates the result of
* a function twice.
*/
memoize: (fn) => { //here we enter the function that we want to memoize
var memory = []; //we need to create an array to hold the previously calculated values, length n (parameter of fn)
if(this.n > memory.length){ //Check to see if this particular value is in the array already.
return memory[this.n]; //How do I access the integer parameter that was passed through fn though? Is this correct?
} else{ // if not, we want to save it and return it
var result = fn(this.n);
memory.push(result);
return result;
}
}
【问题讨论】:
-
我认为 OP 使用 “问题的名称是 JavaScript” 作为夸张,并且非常清楚他们缺乏理解。
-
在代码注释中你说过 “一个新函数,它是 fn 的记忆版本。它永远不会计算函数的结果两次。”@987654323 也是如此@ 应该缓存给定输入值调用
fn的结果并直接返回结果而不是再次调用它?可以对fn(以及因此m_fn)将收到的参数做出哪些假设(如果有)? -
是的,我很清楚我对 JavaScript 一无所知。上周我确实尝试过掌握基础知识,但正如我所提到的,我们从未真正有过“JavaScript 入门”;我们只是被告知要在其中编程。虽然这仍然是一个借口,但这也是我难以理解这一点的很大一部分原因。
-
fn是否可以是另一个需要多个参数和/或非数字参数的函数,例如对象?或者我们应该假设fn将始终是一个接受一个数字参数的函数? -
memoize 函数是一个旨在通过将先前计算的递归值保存在数组或类似数据结构中来减少递归必要性的函数。因此,如果该函数计算出 4 的斐波那契值,则当它调用第一个递归 fib(n-1) 或在此示例中。 3,它将保存该递归的fib值(fib(2)和fib(1)),这样当第二个递归在这个例子中被称为fib(n-2)或2时,它们就不必是通过递归计算,因为值保存在数组中,当我们计算 n-1 时。
标签: javascript parameters memoization