본문 바로가기
JavaScript

클로저를 이용한 피보나치 수열을 리턴하는 메서드

by 짱닭 2020. 10. 12.
반응형

출력할 때 마다 피보나치수열을 차례로 리턴해야 함

클로저의 정의나 특징은 알고 있었으나,

문제에서 파라미터가 정의되지 않았다는 점과
function을 리턴해야 한다는 점이 초기 접근자체를 어렵게 했다.

내가 여태 배운것 중 가장 이해도가 낮다고 생각하는 고차함수의 개념을 이용해야하기 때문에
더 힘들었던 것 같다.

실마리는 검색에서 찾았다.

클로저를 이용해서 함수를 리턴하며 실행하는 방법과
클로저 함수(내부함수)를 이용할 때 내부함수엔 얼마든 파라미터를 써도 된다는 점을 알게되자
조금씩 생각의 가닥이 잡히는 느낌이었다.

우선 몇번 풀어봤던 피보나치 수열의 값을 리턴하는 클로저 함수를 작성했다.

let fibo = function(n){
  if(n<2){
    return n;
  }

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

간단하지만 처음 풀 때만 해도 정말 막막했고,
풀고 나서 내 사고의 확장?을 시켜준 문제였다고 생각한다.

이제 문제는 저 클로저 함수를 외부함수가 실행될 때 마다 호출하며,
호출될 때 마다 그 다음 피보나치 수열의 값을 리턴해야한다는 점이다.

호출할 때 마다 다른 값을 리턴한다는 것은
어딘가에 호출 횟수를 카운트하고 있다는 뜻이다.

이를 위해 전역변수로 외부함수 코드 최상단에 count변수를 만들었다.

코드가 실행될 때 마다 count는 증가해야하고
count가 변화함에 따라 클로저함수에 전달되는 값또한 바뀌어야 한다.

여기서가 문제였다.

1. 함수를 리턴하면서
2. 카운트를 증가시키고
3. 피보나치 수열의 값을 리턴

이 세 과정을 하나의 return 문에서 실행해야 한다.

전..혀 예상하지 못한 방법이 있었다.
사실 이 방법이 이 포스트를 쓰는 이유다.

곰곰이 생각해서 내 머리에서 떠올랐다면 더 오래 기억되고 성장했을 것 같다는 아쉬움마저 드는 방법.

function printFibo(){
  let count=0;

  let fibo = function(n){
    if(n<2){
      return n;
    }

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

  return function(){
    count++;
    return fibo(count-1);
  }
}

몇 시간의 고심할 과정을 아껴준 방법이고 코드이기에 계속 보면서 외워져버렸다.

내부 함수(클로저 함수)는 재귀 함수이며 n번째 피보나치 수열의 값을 리턴하고
printFibo()가 리턴하는 내용은 "함수"이며
즉시 실행되어 count를 증가시키고
n회 실행시 n번째 피보나치 수열의 값을 리턴한다.

출처 :medium.com/@jimmy53120488/function-makefib-implementation-with-javascript-75643763f4cf

 

더 알아볼것

1. count가 어디에 저장되어서 계속 누적이 되고 있는지, 무슨 기법인지
2. return 되는 function이 왜 즉시 실행되는지


A : 1, 2번은 메모이제이션(memoization)으로 설명할 수 있다.

jjanddakdevlogg.tistory.com/entry/%EB%A9%94%EB%AA%A8%EC%9D%B4%EC%A0%9C%EC%9D%B4%EC%85%98-Memoization

반응형

댓글