2017-10-03 4 views
2

したがって、参考資料としてthisを使用して、Javascriptで一般的なメモ機能を記述しようとしています。返された関数を呼び出す

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 fibonacci(n - 1) + fibonacci(n - 2); 
 
} 
 

 
function memoFib = memoize(fibonacci); 
 

 
console.log("Fibonacci of 6 is " + memoFib(6));

のが、私の人生のために私がメモ化関数を呼び出すに適切な構文を思い出すことができない:私は、指示されたとして、それを実装しました。これはどうすればいいですか?どのようにしてこれを一般化してフィボナッチ関数を呼び出すのですか?フィボナッチ関数はフィボナッチ関数の代わりに常に呼び出されます。

答えて

3

あなたはほぼそこにいます。メモ型の関数を作成するときに構文を修正するだけです。 function memoFib =の代わりにvar memoFib =(またはES2015がオプションの場合、constvarより優れています)。そしておそらくあなたもメモをつけたバージョンに再帰呼び出しをしたいと思うので、それらも更新しました。次のコードでは、私はvar memoFibの行より前に来る行のmemoFibを参照していますが、javacriptは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));

そして、あなたは、誰もnonmemoizedバージョンを呼び出すことはできません絶対に確認する場合は、あなたが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); 
})(); 
関連する問題