2017-04-15 107 views
0

一個參數 - 另一個函數 - 並返回該函數的「memoized」版本。一個「memoized」版本的函數緩存並返回其調用結果,以便當它再次用相同的輸入調用時,它不會運行它的計算,而是從緩存中返回結果。請注意,以前的結果應該可以以任何順序檢索,而無需重新計算。將參數引入另一個函數

foo = function (x) { 
console.log("calculating!"); 
return x + 5; 
} 

var memoizedFoo = memoize(foo); 

memoizedFoo(5); 
// calculating! 
// 10 

memoizedFoo(5); 
// 10 (notice how 'calculating!' is not printed this time) 

memoizedFoo(10); 
// calculating! 
// 15 
+5

什麼*是*簡單的問題? –

+0

@ T.J.Crowder,那爲什麼錯了,我有這個問題要解決,但是沒搞懂怎麼弄就是工作, – faisal

+0

問題是你沒問過問。 –

回答

2

我假設問題是如何編寫memoize。您可以將給定參數的第一個結果存儲在容器中,並返回將使用該容器的函數(如果可用)。

下面是一個ES5例子,它僅適用於自變量值,可以有效地轉換爲字符串,如字符串,數字,布爾值:

function memoize(f) { 
 
    // Storage for this function's results 
 
    var values = Object.create(null); 
 
    return function(arg) { 
 
    // Already have it? 
 
    if (Object.hasOwnProperty.call(values, arg)) { 
 
     // Yes, return it 
 
     return values[arg]; 
 
    } 
 
    // No, get it, remember it, and return it 
 
    return values[arg] = f(arg); 
 
    }; 
 
} 
 

 
var foo = function (x) { 
 
    console.log("calculating!"); 
 
    return x + 5; 
 
}; 
 

 
var memoizedFoo = memoize(foo); 
 

 
console.log(memoizedFoo(5)); 
 
// calculating! 
 
// 10 
 

 
console.log(memoizedFoo(5)); 
 
// 10 
 

 
console.log(memoizedFoo(10)); 
 
// calculating! 
 
// 15

如果您需要支持其他種類您需要使用其他結構或填充。這給我們帶來...

...在ES2015 +,我們可以使用Map,這使得它具有更廣泛的參數值的工作:

function memoize(f) { 
 
    // Storage for this function's results 
 
    const values = new Map(); 
 
    return function(arg) { 
 
    // Already have it? 
 
    if (values.has(arg)) { 
 
     // Yes, return it 
 
     return values.get(arg); 
 
    } 
 
    // No, get it, remember it, and return it 
 
    const value = f(arg); 
 
    values.set(arg, value); 
 
    return value; 
 
    }; 
 
} 
 

 
const foo = function (x) { 
 
    console.log("calculating!"); 
 
    return x.foo + 5; 
 
}; 
 

 
const memoizedFoo = memoize(foo); 
 

 
const firstArg = {foo:5}; 
 
console.log(memoizedFoo(firstArg)); 
 
// calculating! 
 
// 10 
 

 
console.log(memoizedFoo(firstArg)); 
 
// 10 
 

 
const secondArg = {foo:10}; 
 
console.log(memoizedFoo(secondArg)); 
 
// calculating! 
 
// 15 
 

 
// Note that maps consider equivalent but distinct objects as different (of course), 
 
// so we don't get the memoized reslt from 
 
// `firstArg` here 
 
const thirdArg = {foo:5}; 
 
console.log(memoizedFoo(secondArg)); 
 
// calculating! 
 
// 10

相關問題