2017-08-13 9 views
1

私は現在メモ帳について学んでいます。私は簡単な練習として、フィボナッチでメモを作成しました。しかし、私はメモをつけた関数の名前を変更しないと、名前を変更したときより完了までに時間がかかります。コードを見てください。Memoizeが期待どおりに機能していませんか?

これは正しく動作せず、正しくキャッシュされません。

function memoize(func) { 
    const cache = {}; 

    return function(args) { 
    const cacheKeys = Object.keys(cache).map(el => +el); 
    if (cacheKeys.includes(args)) { 
     return cache[args]; 
    } 
    cache[args] = func(args); 
    return cache[args]; 
    }; 
} 

function wrapped_fibonacci(n) { 
    if (n <= 2) { 
    return 1; 
    } 
    return wrapped_fibonacci(n - 1) + wrapped_fibonacci(n - 2); 
} 

const fibonacci = memoize(wrapped_fibonacci); // <== I do not rename the function. 

for (let i = 1; i <= 40; i++) { 
    console.log(fibonacci(i)); 
} 

しかし、私はこのようなコードを書くとき。それは正しく動作し、performantです

function memoize(func) { 
    const cache = {}; 

    return function(args) { 
    const cacheKeys = Object.keys(cache).map(el => +el); 
    if (cacheKeys.includes(args)) { 
     return cache[args]; 
    } 
    cache[args] = func(args); 
    return cache[args]; 
    }; 
} 

function fibonacci(n) { 
    if (n <= 2) { 
    return 1; 
    } 
    return fibonacci(n - 1) + fibonacci(n - 2); 
} 

fibonacci = memoize(fibonacci); //<== I rename the function 

for (let i = 1; i <= 40; i++) { 
    console.log(fibonacci(i)); 
} 

ご覧のとおりです。私は関数名を再割り当てしました。 node.jsでこれらのテストを行っています。v8.3.0

最初の結果はそのままです。

time node fib.js 

real 0m2.413s                          │~                              
user 0m2.400s                          │~                              
sys  0m0.008s 

第二の結果は、この上でいくつかの光を当てることができ、このような

time node fib.js 

real 0m0.263s                          │~                              
user 0m0.252s                          │~                              
sys  0m0.008s 

DIFFERENCE 1.8S THATS誰でもと行きますか?

答えて

1

fibonacciは、fibonacciとも呼ばれるメモ機能に置き換えられます。再帰呼び出しは、fibonacci-the-originalfibonacci-the-memoizedに置き換えられたため、このメモの関数を使用しています。

非稼働の例では、wrapped_fibonacciからメモ化機能fibonacciを作成しているが、その機能はまだ再帰的に、unmemoized元、wrapped_fibonacciを呼び出します。あなたもwrapped_fibonacciを交換したい場合は、それが再びスピードアップするでしょう

const fibonacci = wrapped_fibonacci = memoize(wrapped_fibonacci) 
+0

この完璧な理にかなって!あなたのinsiteありがとう! – Nate

関連する問題