자 바스 크 립 트 패키지 의 Fibonacci 수열

5443 단어 JavaScript
자 바스 크 립 트 클 로 징 은 자 바스 크 립 트 고급 을 배 우 는 데 필수 적 인 길이 다.그래서 폐쇄 를 잘 이해 하기 위해 폐쇄 에 관 한 몇 가지 작은 사례 를 기록 해 보 자.Fibonacci 함 수 는 우리 가 비교적 잘 아 는 함수 입 니 다. 일반적으로 우 리 는 재 귀적 인 방법 으로 이 루어 집 니 다.그러나 재 귀 는 이 진 트 리 의 깊이 를 옮 겨 다 니 는 것 임 을 잘 알 고 있 습 니 다. 이런 방법 은 쓰기 에는 간단 하지만 효율 이 높 지 않 습 니 다. 여기 서 피 보 나치 수열 을 실현 하 는 세 가지 방법 을 제시 합 니 다. 그것 이 바로 재 귀 법, 폐쇄 재 귀 법, 전달 법 입 니 다.귀속 법
    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 변 수 를 정의 한 것 은 세 가지 방법의 집행 효율 을 비교 하기 위해 서 입 니 다.
패 킷 푸 시
패 킷 전달 법 은 패 킷 을 닫 는 원 리 를 이용 하여 하나의 배열 (초기 [1, 1] 의 Fibonacci 수열) 을 두 함수 중간 에 존재 하고 내부 함수 가 끊임없이 호출 되 는 배열 을 통 해 배열 을 전체 변수 로 메모리 에 저장 하 는 것 입 니 다. 이렇게 하면 이 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 순환 에서 fiba (n - 1) 와 fiba (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 의 값 을 제시 합 니 다.
세 가지 방법 을 호출 하 다
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 배열 이 차지 하 는 공간 이 점점 커지 고 시스템 은 계속 인용 되 어 메모리 유출 을 초래 할 수 있 습 니 다.따라서 폐쇄 를 사용 할 때 는 이 점 을 주의해 야 한다.

좋은 웹페이지 즐겨찾기