2010-04-18 11 views
4

내가 Javascript : The Good Parts라는 책을 읽는 동안.자바 스크립트 클로저 질문

우리는 우리가 memoized 기능을하는 데 도움이 기능을함으로써이 문제를 일반화 할 수 있습니다 나는 코드 울부 짖는 소리의 조각을 이해할 수 없습니다. memoizer 함수는 은 초기 메모 배열을 취하고 기본 함수를 취합니다. 메모 저장소를 관리하고 필요에 따라 기본 함수를 호출하는 셸 함수를 반환합니다.

var fibonacci = memoizer([0, 1], function (test, n) { 
    return test(n - 1) + test(n - 2); 
}); 
: 우리는 지금 초기 메모 배열과 기본적인 기능을 제공하는 memoizer과 피보나치을 정의 할 수 있습니다

var memoizer = function (memo, fundamental) { 
    var shell = function (n) { 
     var result = memo[n]; 
     if (typeof result !== 'number') { 
      result = fundamental(shell, n); 
      memo[n] = result; 
     } 
     return result; 
    }; 
    return shell; 
}; 

: 우리는 기본 기능에 쉘 함수와 함수의 매개 변수 전달

제 질문은 테스트 기능입니다. 언제 정의되고 호출됩니까? 그것은 나에게 매우 혼란스러워 보입니다. 또한 나는이 진술 : memo[n] = result;이 쓸모 없다고 생각한다. 내가 틀렸다면 수정하십시오.

+0

우와. 함수 적 프로그래밍 지식이 거의없는 사람으로서,이 코드는 내 마음을 날려 버렸습니다. 너무 똑똑해! – dmb

+0

관련 내용 : [자바 스크립트 - 좋은 부분 "예제 (4.15 절)에 대한 설명] (https://stackoverflow.com/questions/3798858/explanation-on-javascript-the-good-parts-example-section-4 -15) – Bergi

답변

1

memo[n] = result;은 memoization 배열 또는 캐시에 새로 계산 된 번호를 저장합니다. test 함수는 memoized 함수의 인수이며 memoizer에 의해 정의되고 전달됩니다. 호출 될 때 계산할 값이 이미 캐시되었는지 여부를 확인합니다. 그렇다면 캐시에서이를 반환합니다. 그렇지 않으면 다시 계산됩니다. 위의 모든 코드가 실행 된 후

, 우리는 메모리에서이 같은 것을 얻을 수 (그러나 캡슐화 된 memo 배열 orig_fibonacci과) :

var memo = [0, 1]; 

function fibonacci(n) { 
    var result = memo[n]; 
    if (typeof result != 'number') { 
    result = orig_fibonacci(n); 
    memo[n] = result; 
    } 
    return result; 
} 

function orig_fibonacci(n) { 
    return fibonacci(n - 1) + fibonacci(n - 2); 
} 
4

이 읽기 ​​:

재미있는 코드이었다

아마도 memoization이 함수의 결과를 저장하고 있다는 것을 알고 있으므로 다음에 함수를 호출 할 때 대답을 계산할 필요가 없으므로 메모를 찾을 수 있습니다.

그래서 우리는 int를 취하고 int를 반환하는 fibonacci 함수에 대한 응답을 저장해야합니다. > 0 FIB (1) - -> 1

var fibonacci = memoizer([0, 1], function (test, n) { 
    return test(n - 1) + test(n - 2); 
}); 

통화 초기 메모 어레이, 맵핑 FIB (0)으로 memoizer.

나머지는 함수와 숫자를 사용하는 명명되지 않은 함수를 정의합니다. 'test'는 나쁜 이름이므로 "recursive_fibonacci_helper"여야합니다.

이 이름없는 함수는 "기본"매개 변수가됩니다. memoizer 함수는 int 인수를 취하는 함수 (셸)를 반환합니다. 결국 피보나치 함수가됩니다.

누군가가 "fibonacci (5)"라고 말하면. 그들은 정말로 "쉘 (5)"이라고 부릅니다. 클로저에 대한 중요한 부분은 "기본"및 "메모"가 이미 바인딩되어 있다는 것입니다.

그래서 '셸'은 무엇을합니까?

메모 테이블에서이 입력에 대한 대답이 이미 계산되었는지 확인합니다. 응답 (== '숫자')이 있으면 리턴합니다. 그렇지 않으면 메모를 계산하여 메모 테이블에 저장합니다. memo[n] = result은 실제로 계산 된 결과를 메모 테이블에 저장하고 있습니다.