JavaScript閉鎖のFibonacci数列

4984 ワード

JavaScriptが閉じているのはJavaScriptの高級な勉強に必要な道です.ですから、クローズドをよりよく理解するために、クローズドに関するいくつかのケースを記録します.Fibonacci関数は私たちがよく知っている関数です.一般的に再帰的な方法で実現します.しかし、再帰は二叉樹の深さを遍歴していることはよく知られています.この方法は簡単に書いても、効率はそんなに高くないです.ここでFibonacci数列を実現する3つの方法を提供します.再帰法
    var count;
    var count=0;
    var fib=function(n){
        count++;
        if(n==1||n==2){
            return 1;
        }
        else{
            return fib(n-2)+fib(n-1);
        }
    }
このようなコードで示したように、再帰法は最も簡単な解決法であり、ここでcount変数を定義し、3つの方法の実行効率を比較するためである.
クローズド?デリバリー法
クローズド・デリバリーとは、クローズド・パックの原理を利用して、1つの配列(初期は「1,1」のFibonacci数列)を、2つの関数の中間に存在させ、内部関数を介して連続的に呼び出された配列で、配列をグローバル変数としてメモリに格納することで、このFibonacci数列を拡張し、最終的に所望のFibonacci数を求めます.以下のコード例です.
    var count2=0;
    var fiba = (function(){
        var arr = [0,1,1];   // 0     ,        
        return function(n){
            count2++;   
            var res=arr[n]; /*       arr,   ,  arr      */
            if(res){
                return res;
            }else{
                arr[n]=fiba(n-1)+fiba(n-2);
                return arr[n];
            }   
        }
    })();
再帰的にも使用されていますが、クローズドバックは再帰回数が大幅に減少しています.最初にfiba(3)に戻りますので、fiba(3)を配列に格納することができます.これは配列中のarr[3]+arr[2]によって、fiba(4)の値を得て、数組の中に格納して、このように往復して、最終結果を得ることができます.これは典型的に空間で時間を換える例であると言える.
配達法
デリバリー法は最も効率的で、forサイクルの中でフィバ(n-1)とフィバ(n-2)の値を変えて、最終的な結果を求めます.コードは以下の通りです.
    var count3 = 0;
    var fib3 = function (n) {
        var x = 1;
        var y = 1;
        var z = 0;
        if (n == 1 || n == 2) {
            return 1;
        } else {
            for (var i = 2; i < n; i++) {
                count3++;
                z = x + y;
                x = y;
                y = z;
            }
            return z;
        }
    };  
この方法も比較的よく理解されるべきで、ここでは多すぎる説明はしないで、以下は呼び出しプロセスであり、同じ場合にそれぞれcountの値を与えている.
3つの方法を呼び出す
onload=function(){
        var t = fib(8);
        alert(t);   //  21
        alert(count);  //count=41
        var z=fiba (8);      
        alert(z);       //  21
        alert(count2);    //count2=13
        var m = fib3(8);
        alert(m);           //  21
        alert(count3);     //count3=6
    }
上記の例から、デリバリーの効率が最も高く、次いで閉込めであり、再帰法の効率が最も低いことが分かる.閉塞効率は相対的な再帰法によってかなり高くなりましたが、この方法は不適切な使用によってメモリが漏れてしまいます.大きなFibonacci数を要求すると、arr配列の占める空間がますます大きくなります.また、システムが絶えず引用されてメモリが解放されなくなり、メモリが漏れてしまいます.ですから、クローズドを使う時は、この点に注意してください.