1. 메모이제이션(Memoization)

메모이제이션이란 반복되는 결과를 메모리에 저장한다.

반복적으로 같은 연산을 수행할 때 연산을 하지 않고 결과를 저장해두었다

출력하는 코딩 기법을 말한다.

function factorial(n) {
	if (Number.isInteger(n) && n > 0) {
	  if (!(n in factorial)) {
		factorial[n] = n * factorial(n - 1);
	  }
	  console.log(n);
	  return factorial[n];
	} else {
	  return '잘못된 숫자가 입력되었습니다.';
	}
  }
  
  factorial[1] = 1; // 캐시를 초기화합니다.
  console.log(factorial(6)); // => 720
  console.log(factorial(5)); // => 120 / 이 값은 이미 캐시에 존재합니다.

예제코드를 나름 분석하려고 로그를 몇개 찍어보았다.

Untitled

캐시 데이터는 일반적으로 연산결과를 저장하는 함수의 배열에 저장되었다.

그리고 6을 연산한 뒤 바로 5를 연산시켜봤더니 기존의 연산결과가 이미 저장되어 있어 바로 결과값을 출력했다.

이 결과의 비밀은 if문에서 n in factorial 로 factorial 연산결과가 이미 있는지 검사하고, return을 캐시데이터로 하는 부분.

그리고 각 재귀 연산이 될때마다 결과 값을 함수 배열에 저장하는 구문이 존재하기에 이런 결과가 가능한 것이다.

확실히 불필요한 연산을 줄일 수 있어 프로그램 속도 면에서 빠를 것 같다. 메모리 측면은…음 몰루?

2. 클로저-중첩-함수

클로저…아마 이 과제에서 가장 어려운 부분일 것이다.

먼저 클로저란 무엇인가? 에 대한 정의를 찾아보았다.

“A closure is the combination of a function and the lexical environment within which that function was declared.”

클로저는 함수와 그 함수가 선언됐을 때의 렉시컬 환경(Lexical environment)과의 조합이다.

뭔소리여너무 어려운 설명에 어이가 없어서 예제부터 찾아보기로 했다.

function outerFunc() {
  let x = 10;
  const innerFunc = function () { console.log(x); };
  return innerFunc;
}

const inner = outerFunc();
inner(); // 10

클로저의 가장 간단한 예제다.

이 예제의 설명을 읽어보니 클로저가 조금 이해 되는 것 같았다.