再帰関数プログラム用に最適化

私たちは、すべての再帰関数を書いて、以下は典型的な再帰関数であると考えています。

関数フィボナッチ(N){
       戻り N <2?N:フィボナッチ(N - 2)+フィボナッチ(N - 1 )。
}

しかし、再帰関数のように非常に明白な問題、結果を再計算する必要があるの各呼び出しはとても深すぎる再帰があまりにも多くのメモリは、スタックオーバーフローが発生占める、そこにあります。

このような状況に鑑み、我々は真ん中の値をキャッシュするキャッシュポリシーを使用することができます。

VaRのフィボナッチ= 関数(){ 
    せキャッシュ = {};
    戻り 関数(N){
         場合(!キャッシュ[N]){ 
            キャッシュ[N] = N <2?N:フィボナッチ(N-2)+フィボナッチ(N-1 )。
        } 
        戻りキャッシュ[N]。
    } 
}();

クロージャを使用して上記の方法は、再帰的な階層のパフォーマンスが大幅に改善されてきたときに、コンソールにより試すことができ、キャッシュ・バッファの計算値を保持するローカル変数を宣言します。

ここで設定されている場合、キャッシュ= {}性能は、(実際には、キーは、デジタルに限定されるものではなく、いくつかのより多くのシーンを使用する)より高くなるので、] [=説明し、なぜキャッシュを使用= {}はなく、キャッシュに実際には、単にキーとして100の目標値を設定したい場合、キャッシュ= []、セットキャッシュ[100]は、結果は0〜99の配列が空に初期化されること、およびオブジェクトを設定します、それが唯一のキーに設定されますこの1 100。

ここでも一般的な再帰関数のバッファの関数として、包装の層。

せmemoizeは= 関数{(FUNC)を
    聞かせてキャッシュ = {};
    リターン 機能(キー){
         場合(!のキャッシュ[キー]){ 
            キャッシュ[キー] = func.apply(この、引数); 
        } 
        リターンキャッシュ[キー]。
    } 
} 
フィボナッチせ = memoize(関数(N){
      リターン?N <2 N - 2)+フィボナッチ(N -フィボナッチ(N 1 ); 
});

概要:実際には、非常に単純な原理は、実際には、キャッシュの中間値に変数を宣言したソースコードフレームワークの多くを見ることで、パフォーマンスを向上させるために、このメソッドを使用している、我々は通常、メンテナンス独自のコンポーネントライブラリや書き込みビジネスコード中に使い切ることができます。

おすすめ

転載: www.cnblogs.com/luoyanan/p/11824843.html