let mem = new Array(100000).fill(0)
function fib(n) {
if (n <= 2) {
return 1
}
// 메모이제이션
// mem배열에 이미 값이 할당되어 있는 경우 바로 그 인덱스의 값을 뱉는다.
if (mem[n] !== 0) {
return mem[n]
} else {
mem[n] = (fib(n - 1) + fib(n - 2)) % 1234567
}
return mem[n]
}
fib(5)
console.log("fib(5): ", fib(5))
재귀함수가 두개있을때, 어느 순서대로 처리되는지 궁금해서 찾아본 결과,
fib(1)에서 함수가 종료되고 1을 뱉으면 memory에서 제거되고 fib(2)는 남아있던 fib(n-2)함수를 부른다(memory에 쌓임) 그러면 fib(1)이 쌓이고 1뱉고 , fib(0)도 1뱉는다. 그리고 fib(2)는 그 합인 1을 뱉으면서 memory에서 제거되다.
반복...
❌ 하지만 ,,, 메모이제이션 + 재귀 방법으로 했을 경우, 오답 + 런타임 오류 발생
왜 ?????
function fib(n) {
let ans = [0, 1]
if (n <= 1) return ans[n]
for (let i = 2; i < n + 1; i++) {
ans.push((ans[i - 2] + ans[i - 1]) % 1234567)
}
return ans[n]
}
function solution(n) {
var answer = 0
answer = fib(n)
return answer
}