-
[JS] MemoizationJavaScript 2018. 2. 20. 19:24
[Memoization]
for문은 메모리 낭비가 심하다.
한번 사용한 값은 저장하여 메모리를 효율적으로 사용해보자.
아래는 클로저를 사용하고, 재귀함수를 사용하였다.
재귀함수는 함수가 자기 자신을 호출하는 것을 말한다.
// Memoization
var _commonctrl = (function() {
var save = {};
var fact = function(number) {
if(number > 0) {
var saved = save[number - 1] || fact(number - 1);
//1. save object에는 현재 저장값이 없으므로 undefined를 반환, 그러므로 saved에는 fact(number - 1)가 저장;
var result = number * saved;
//2. result에 assign
//result = 3 * fact(3 - 1);
//result = 2 * fact(2 - 1);
//result = 1 * fact(1 - 1);
save[number] = result;
//3. save object에 result를 Memo
//save[3] = 3 * fact(3 - 1);
//save[2] = 2 * fact(2 - 1);
//save[1] = 1 * fact(1 - 1); => 1-1은 number가 0이라는 것인데, 0이되면 else의 return 1을 반환
console.log('saved: ' + saved); // fact(number - 1);
console.log('result: ' + result); // 7 *fact(number - 1);
return result;
//4. return 값으로 result를 반환하였고, result에는 number *
//fact(number - 1)라는 함수를 또 호출해주기 때문에
//fact(2); => 3 * fact(1) <= 2 * 1임 // 즉 3 * 2 * 1
//fact(1); => 2 * fact(0) <= 1임 //즉 2 * 1
//순으로 계속 호출을 하게 된다.
} else {
return 1;
//number가 0보다 크지 않을 경우 return 1
//fact(0); => 1
}
};
return fact;
})();
_commonctrl(3);
'JavaScript' 카테고리의 다른 글
Clean Coding (0) 2021.07.08 [JS] Script의 위치 (0) 2019.11.24 [JS] event.stopPropagation()로 버블업 막기 (0) 2018.02.08 [JS]생성자 호출패턴 This 바인딩 (0) 2018.01.27 [JS] 메서드 호출패턴과 This 바인딩 (0) 2018.01.27