所以我试图在Javascript中编写一个常规的memoizing函数,使用this作为我的参考资料。我按照指示实施了它:
public class A
{
public int Id {get; set;}
public abstract string Type { get; }
}
public class B
{
public override string Type => "value";
}

但是对于我的生活,我不记得调用memoized函数的正确语法。我该怎么做呢?我如何概括这一点,以便它被记忆的斐波纳契函数总是被称为而不是原始函数斐波那契?
答案 0 :(得分:3)
你几乎就在那里;您只需要在创建memoized函数时修复语法。执行function memoFib =
而不是var memoFib =
(或者如果ES2015是一个选项,const
将优于var
)。并且大概你也希望将递归调用到memoized版本中,所以我也更新了它们。在下面的代码中,我可能看起来很奇怪,我在早于var memoFib
行的行上引用memoFib,但javascript允许hoisting。
function memoize(func) {
var memo = {};
var slice = Array.prototype.slice;
return function() {
var args = slice.call(arguments);
if (args in memo)
return memo[args]
else
return (memo[args] = func.apply(this, args));
}
}
function fibonacci(n) {
if (n === 0 || n === 1)
return n;
else
return memoFib(n - 1) + memoFib(n - 2);
}
var memoFib = memoize(fibonacci);
console.log("Fibonacci of 6 is " + memoFib(6));

如果你想绝对确定没有人可以调用非原型版本,那么你可以将其隐藏在IIFE内:
const fibonacci = (function () {
function unmemoizedVersion(n) {
if (n === 0 || n === 1)
return n;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}
return memoize(unmemoizedVersion);
})();