function fibonacci(n) {
const memo = [0, 1];
function fib(n){ //서브함수를 만든다.
if(memo[n] !== undefined) return memo[n];
//서브펑션 내에서 메모에 해당 값이 있는지 확인한다.
//여기서 if(memo[n]) 으로 하면 기존에 메모에 o,1을 할당해주었기 때문에 true가 된다.
//무조건 memo[n]을 리턴하게됨;;;; 그럼 무한반복;;;
memo[n] = fib(n-1) + fib(n-2); //서브펑션에 쪼갠 식을 계산한 값을 메모한다
return memo[n]; //memo[n]값을 넘겨줌
}
return fib(n); //서브함수 실행
}
담에 fib가 아닌 경우에 메모이제이션을 하는 것을 분석해봐야겠다!!
그럼 확실히 이해될듯!!
https://youtu.be/2RwlzBDhGh4
서울대 나오신 어떤분께서 다이나믹 프로그래밍에 대해 설명하신 유튜브 영상이다. 느므느므 설명 잘해주심! 아마 c언어로 예시를 드신 것 같다!
그래서 예시를 보고 자바스크립트 코드로 옮겨봄
let memo = [0,1];
function recur(n){
if(n <= 1) return memo[n];
if(memo[n] !== undefined) return memo[n];
memo[n] = recur(n-1) + recur(n-2);
return memo[n];
}
이렇게 따로 서브함수를 만들지 않고 계산할 수도 있다. 이때는 memo를 전역변수에 두었음. 재귀되는 함수와 별개로 선언을 해야하는건가! 여튼 위에 쓴 예시보다 간결하고 더 읽기 좋은 것 같다.
function fib(n){
let result = [0, 1];
if(n < 2) return n;
for(let i = 2; i <= n; i++){
result[i] = result[i-1] + result[i-2];
}
return result[n];
}