2016-12-11 4 views
1

Memoizeは、関数の変数が

var fibo = function (x) { 
 
    console.log(x); 
 
    if (x === 1) return 1; 
 
    if (x === 2) return 2; 
 
    return fibo(x - 1) + fibo(x - 2); 
 
}; 
 

 
// fibo = _.memoize(fibo); 
 
var fibom = _.memoize(fibo); 
 
console.log(fibom(5));
<script src="https://cdn.jsdelivr.net/lodash/4.17.2/lodash.min.js"></script>

を変更したときに失敗するのはなぜmemoize作業(コメントアウトされたコードに示すように)が、新しい変数に割り当てられていないとき、元の関数の変数名に割り当てられたときに?

答えて

4

メモ型関数を新しい変数に代入すると、再帰呼び出しは未メモ型バージョンに変わりません。コメントアウトされたコードのように参照を上書きする必要があります。

+0

ああ。今あなたがそれを指摘したことは明らかです... – TrueWill

1

再帰関数は、memoized関数の代わりに元の非メモ化関数を呼び出すためです。

fibo関数を代入/オーバーライドすると、元の関数内のfibo呼び出しが新しいメモ機能付き関数を呼び出し、動作します。

関連する問題