cbw1030
기록하는 공간
cbw1030
전체 방문자
오늘
어제
  • 전체보기 (101)
    • Programming (99)
      • Java (19)
      • Servlet (10)
      • Spring Framework (13)
      • Javascript (22)
      • AWS (2)
      • 네트워크 (8)
      • 데이터베이스 (13)
      • 리눅스 (3)
      • 블록체인 (7)
      • 용어 정리 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 삼성SDS 브라이틱스
  • beautifulsoup
  • 인공지능
  • 생활코딩
  • 데이터 사이언스
  • 브라이틱스 스튜디오
  • 머신러닝
  • 차원축소
  • Brightics AI
  • Brightics Studio
  • react
  • web
  • 삼성SDS
  • 데이터분석
  • 크롤링
  • 브라이틱스 튜토리얼
  • 브라이틱스
  • javascript
  • 브라이틱스 스튜디오 사용법
  • Brightics

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
cbw1030

기록하는 공간

[Javascript]  Implementing in memoization(fibonacci, recursion)
Programming/Javascript

[Javascript] Implementing in memoization(fibonacci, recursion)

2019. 3. 8. 11:38
반응형

오늘은 피보나치 수열을 재귀함수를 통해 2가지 방법으로 구현을 해보겠습니다.

1. 메모화(memoization)을 하지 않았을 때

2. 메모화(memoization)을 했을 때


우선 피보나치 수열의 정의와 메모화(memoization)에 대해서 알아보겠습니다.


피보나치 수열(Fibonacci sequence)

f(1) = 1

f(2) = 1

f(3) = f(2) + f(1) = 2

f(4) = f(3) + f(2) = 3

f(5) = f(4) + f(3) = 5 ···   


메모화(Memoization)

메모화란 프로그래밍을 할 때 반복되는 결과를 저장해서 이후 동일한 결과값이 나올 경우, 저장된 결과를 가져와 빨리 실행하는 기법을 의미합니다.


우선 메모화를 하지 않고 피보나치 수열을 구현해보겠습니다.

var fibo = function (n) {

if (n === 0 || n === 1) {

return n;

} else {

return fibo(n - 1) + fibo(n - 2);

}

}


fibo(10); // 55

그렇다면 fibo(10)을 계산하는 동안 재귀함수를 몇 번 호출하는지 알아보겠습니다.

var count = 0;


var fibo = function (n) {

count++;

if (n === 0 || n === 1) {

return n;

} else {

return fibo(n - 1) + fibo(n - 2);

}

}

fibo(10); // 55 console.log(count); // 177

fibo(10)을 계산하면서 177번의 반복을 하게됩니다. 인자의 수가 커진다면 엄청날 것입니다.

fibo(30)을 계산하면 83만번 이상의 반복을 하게됩니다.

여기서 필요한 것이 메모화입니다. 메모화는 반복되는 결과를 저장해서 이후 활용을 한다고 했습니다.

그럼 반복되는 결과를 저장하기 위해 객체를 선언해서 함수가 호출될 때마다 객체에 저장을 해보겠습니다.

var count = 0;

var memo = {};


var fibo = function (n) {

count++;

if (memo.hasOwnProperty(n)) {

return memo[n];

}

if (n === 0 || n === 1) {

return n;

} else {

memo[n] = fibo(n - 1) + fibo(n - 2);

return fibo(n - 1) + fibo(n - 2);

}

}


fibo(10); // 55 console.log(count); // 37

반복되는 결과를 memo 객체에 저장을 해놓고 hasOwnProperty 메소드를 사용해 코드를 구현해봤습니다.

fibo(10)의 카운팅은 37번 밖에 되지않습니다. 심지어 fibo(1000)을 해도 카운팅이 4000을 넘지 않습니다.




recursion을 사용할 때는 무작정 쓰는 것이 아니라 메모화(Memoization)을 활용한다면 시간을 많이 단축할 수 있습니다.


반응형
저작자표시 (새창열림)

'Programming > Javascript' 카테고리의 다른 글

[Javascript] Window, DOM, BOM이란?  (0) 2019.06.21
[Javascript] ES6 화살표(에로우) 함수  (0) 2019.03.27
[Javascript] JSON.parse(), JSON.stringify()에 대해 알아보자  (0) 2019.03.05
[Javascript] ES6 템플릿 리터럴  (0) 2019.03.03
[Javascript] this 이것은 무엇인가  (0) 2019.02.25
    'Programming/Javascript' 카테고리의 다른 글
    • [Javascript] Window, DOM, BOM이란?
    • [Javascript] ES6 화살표(에로우) 함수
    • [Javascript] JSON.parse(), JSON.stringify()에 대해 알아보자
    • [Javascript] ES6 템플릿 리터럴
    cbw1030
    cbw1030

    티스토리툴바