메모화란 무엇인가
메모화는 값비싼 함수 호출의 결과를 저장하고 동일한 입력이 다시 공급될 때 캐시된 결과를 반환하여 응용 프로그램의 속도를 높이는 최적화 기법이다.
예를 들어 재귀를 사용하여 숫자의 계승을 계산하는 방법이 있습니다.
function recursiveFac(n) { if (n === 0) { return 1 } else { return n * recursiveFac(n - 1) }}
이 기능은 잘 작동하지만 장기적으로,그것은 비싼 것입니다. 먼저 메모 팩(7)을 호출 한 다음 메모 팩(8)을 호출하면 이전에 계산 된 값을 저장할 캐시없이 전체 프로세스를 반복하여 함수를 7 번 더 반환해야한다고 가정 해 봅시다.
const cache = {}function memoFac(n) { if (cache) { return cache } else { if (n === 0) { cache = 1 } else { cache = n * memoFac(n - 1) } return cache}
그래서 우리는 그 키에 대한 결과를 저장할 다른 함수 메모 팩()과 글로벌 캐시 객체를 가지고 있습니다.
이제 메모 팩(7)을 호출 한 후 메모 팩(8)을 호출하면 캐싱 계산을 유지하기 위해 함수 외부로 이동 한”캐시”객체에 팩토리얼(7)에 대한 계산 된 값을 이미 저장했습니다. 따라서 우리는 함수를 한 번만 호출하고 8*메모 팩(7)을 계산해야합니다.이 메모 팩(7)은 캐시 된 값을 검색하기 위해”캐시”로 바로 보냅니다. 최고!
그러나 잠깐-메모가 동일한 일반 형식(함수의 외부 범위의 캐시에서 값을 검색하거나 익명 클로저 함수를 사용하여 값을 계산)을 따르는 경우 일반적인 메모 함수를 작성할 수 없습니까? 예,우리는 할 수 있습니다!
자바스크립트에서의 메모의 개념은 주로 두 가지 개념에 기초한다.
- 클로저
- 고차 함수
function memoizerHoc(fun){ let cache = {} return function (n){ if (cache != undefined ) { return cache } else { let result = fun(n) cache = result return result } }}
여기서 우리는 임시 함수 메모 작성기()와 반환 된 함수(클로저)내에서 액세스 할 수있는 로컬 변수 캐시를 가지고 있습니다.