아래 링크의 강의 중 Section 16. Runtime Complexity in Practice - Fibonacci
의 내용을 추려 이번 글을 작성하였습니다.
The Coding Interview Bootcamp: Algorithms + Data Structures on Udemy
function fib(n) {
const result = [0, 1];
for (let i = 2; i <= n; ++i) {
const a = result[i - 2];
const b = result[i - 1];
result.push(a + b);
}
return result[n];
}
console.log(fib(9));
function iteratingFib(n) {
if (n <= 1) return n;
let twoBehind = 0;
let oneBehind = 1;
let result = 0;
for (let i = 1; i < n; ++i) {
result = twoBehind + oneBehind;
twoBehind = oneBehind;
oneBehind = result;
}
return result;
}
console.log(iteratingFib(9));
for문
을 돌면서 배열 result
내의 index
를 활용해 앞의 수 b
와 앞앞의 수 a
를 더해서 배열 result
에 push한다. 결과값으로 배열 result
내 입력값 n
번째에 있는 값을 반환한다.
첫 번째 함수에서 유의할 점 0, 1
을 배열 result
에 미리 설정해둔다는 점이다.
function fib(n) {
if (n === 0) return 0;
else if (n === 1) return 1;
else return fib(n - 1) + fib(n - 2);
}
console.log(fib(9));
function fib(n) {
if (n < 2) {
return n;
}
return fib(n - 1) + fib(n - 2);
}
console.log(fib(9));
위 두 코드 모두 재귀함수를 통해 피보나치 수열을 구하는 공식이다. 입력값 n
이 0
혹은 1
일 경우 더할 값이 없으므로 그대로 n
을 반환하고, 아닐 경우 재귀함수를 돌면서 앞의 수와 앞앞의 수를 더해나간다. 밑의 도표와 같이 작동한다.
n
으로 5를 입력했을 경우 return fib(n - 1) + fib(n - 2)
를 반복하면 결과적으로 fib(1)
은 5개가 남는다. 이 값을 모두 더해서 반환하는 것이다.