let recur = 0;
function fib(n) {
recur++;
if(n <= 2) return 1;
return fib(n-1) + fib(n-2);
}
// fib(5) 9번 호출
// fib(6) 15번 호출
// fib(7) 25번
-> 이미 구해놨던 부분을 다시 사용하면, 반복을 줄일 수 있다.
function fib(n, memo = []) {
if(memo[n] !== undefined) return memo[n];
if(n <= 2) return 1;
let res = fib(n-1, memo) + fib(n-2, memo);
memo[n] = res;
// console.log(memo);
return res;
}
// console.log(fib(5))
// [ <3 empty items>, 2 ]
// [ <3 empty items>, 2, 3 ]
// [ <3 empty items>, 2, 3, 5 ]
memo
배열을 만들어, 이미 만들어두었던 값을 memo
안에 저장한다.memo
안에 필요한 값이 있다면 하위 문제를 반복하지 않고 메모에서 값을 꺼내온다.fib(5)
를 구하고자 한다면,fib(5) = fib(4) + fib(3)
으로 구할 수 있는데,fib(4) = fib(3) + fib(2)
이다.fib(4)
를 구할때, 이미 fib(3)
은 구해져서 메모에 저장해 놓았으므로,fib(3)
을 구하는 반복적인 호출을 하지 않고 메모에서 꺼내온다.function fib(n) {
if(n <= 2) return 1;
const fibNums = [0, 1, 1];
for(let i=3; i<=n; i++) {
fibNums[i] = fibNums[i-1] + fibNums[i-2];
}
// console.log(fibNums);
return fibNums[n];
}
// fib(5)
// [ 0, 1, 1, 2, 3, 5 ]
// fib(6)
// [ 0, 1, 1, 2, 3, 5, 8 ]