아래와 같이 정의된 피보나치 수열 중 n번째 항의 수를 리턴해야 합니다.
let output = fibonacci(0);
console.log(output); // --> 0
output = fibonacci(1);
console.log(output); // --> 1
output = fibonacci(9);
console.log(output); // --> 34
Advanced
피보나치 수열을 구하는 효율적인 알고리즘(O(N))이 존재합니다. 재귀함수의 호출을 직접 관찰하여 비효율이 있는지 확인해 보시기 바랍니다.
function fibonacci(n) {
if(n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
➡️ 아래와 같은 오류 발생. Advanced의 내용을 고려해 보자
동적계획법
간단한 하위 문제를 해결하면서
좀 더 복잡한 상위 문제로 나아가는 방식 (상향식)
O(N): dynamic with meoization
이미 해결한 문제의 정답을 따로 기록해두고
다시 해결하지 않는 기법
function fibonacci(n) {
const arr = [0, 1];
const fibo = (n) => {
if(arr.includes(arr[n])){
return arr[n];
}
arr[n] = fibo(n-1) + fibo(n-2);
return arr[n];
}
return fibo(n);
}
/*
n = 5
1. fibo(5) 실행, arr = [0, 1]
arr[5] = fibo(4) + fibo(3)
2. fibo(4) 와 fibo(3) 실행
fibo(4) = fibo(3) + fibo(2)
fibo(3) = fibo(2) + fibo(1)
2-1. fibo(3)
= fibo(2) + fibo(1)
fibo(2)의 경우,
arr[2] = fibo(1) + fibo(0) = 1
=> arr = [0, 1, 1]
2-1-1. fibo(3)
= fibo(2) + fibo(1)
= 1 + 1 = 2
=> arr = [0, 1, 1, 2]
2-2. fibo(4)
= fibo(3) + fibo(2)
= 2 + 1
= 3
=> arr = [0, 1, 1, 2, 3]
3. arr[5] = fibo(4) + fibo(3) = 5
=> arr = [0, 1, 1, 2, 3, 5]
*/