피보나치 수열을 순차적으로 출력하는 클로저 형태의 함수를 작성해야 합니다.
피보나치 수는 0과 1로 시작하며, 다음 피보나치 수는 바로 앞의 두 피보나치 수의 합이 됩니다.
예시) 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...
리턴되는 클로저 내부 함수(inner function)의 구현은 recursive 혹은 iterative한 방법 중 어떤 것이어도 괜찮습니다.
const fn = test1();
console.log(fn()); // --> 0
console.log(fn()); // --> 1
console.log(fn()); // --> 1
console.log(fn()); // --> 2
console.log(fn()); // --> 3
console.log(fn()); // --> 5
내가 알고있던 피보나치 문제 해결방법은 재귀방식을 사용해 입력 한 수에 각각 -2, -1한 수를 합쳐서 리턴하는 방법인데 이번 문제는 함수를 실행할 때 마다 피보나치가 실행돼기 때문에 클로저 개념을 사용해 내부에 피보나치를 선언하고 함수를 실행할 때마다 숫자변수를 1씩 증가시키고 그것을 내부함수의 모수로 넣어 리턴해줘야 겠다.
function fibofibo() {
let count = 0
const fibonacci = function (n) {
if (n < 2) {
return n
}
return fibonacci(n - 1) + fibonacci(n - 2)
}
return function () {
count++
return fibonacci(count - 1)
}
}
내가 알고 있는 클로저의 개념은 내부함수가 외부함수를 사용할 수 있다는 것이고, 다른 함수가 클로저로 내부함수를 호출해도, 내부함수의 환경은 그대로 보존되기 때문에 위의 코드처럼 count변수를 모수로 사용할 수 있다는 것이다.
이것은 코드로 직접 작성하려하니 어려웠는데 이번 기회에 클로저를 실습해볼 수 있어서 기억에 남을 것 같다.