큰 문제를 작은 하위 문제로 쪼개면서 문제를 해결하는 방식.
재귀 함수 혹은 메모이제이션을 통해 구현된다.
계산한 값을 저장해두었다가 필요할 때 재사용하는 기법 -> 동일한 하위 문제의 반복적인 호출 x.
작은 하위 문제부터 시작하여 점진적으로 큰 문제를 해결하는 방식.
작은 문제들의 해를 계산하여 더 큰 문제들의 해를 구하는 방식.
반복문.
f(n-1) + f(n + 2) )f(n-1) + f(n-2) )위와 같은 특징을 가진 문제인지 먼저 살펴봐야한다.
문제를 작은 부분 문제로 분할하고, 부분 문제의 해답을 메모이제이션하거나 재귀적으로 계산하여 저장하는 방식으로 구현해야 한다.
기존의 중복 계산을 피하고 문제를 효율적으로 해결할 수 있다.
// 0 1 1 2 3 5 8 13 21 34 55 89 144 . . .
function fibo1(n) {
if (n === 1 || n === 2) {
return 1;
} else {
return fibo1(n - 1) + fibo1(n - 2);
}
}
function fibo2(n) {
const fiboArray = [0, 1, 1];
for (let i = 3; i <= n; i++) {
fiboArray[i] = fiboArray[i - 1] + fiboArray[i - 2];
}
return fiboArray[n];
}
let fiboMemo = {};
function fibo3(n) {
if (n === 1 || n === 2) {
return 1;
}
if (fiboMemo[n]) {
return fiboMemo[n];
}
fiboMemo[n] = fibo3(n - 1) + fibo3(n - 2);
return fiboMemo[n];
}
// fibo 함수의 실행 시간 측정
performance.mark("startFibo");
console.log(fibo1(20));
performance.mark("endFibo");
performance.measure("executionTimeFibo", "startFibo", "endFibo");
const measureFibo = performance.getEntriesByName("executionTimeFibo")[0];
console.log(`fibo Execution time: ${measureFibo.duration}ms`);
// fibo2 함수의 실행 시간 측정
performance.mark("startFibo2");
console.log(fibo2(20));
performance.mark("endFibo2");
performance.measure("executionTimeFibo2", "startFibo2", "endFibo2");
const measureFibo2 = performance.getEntriesByName("executionTimeFibo2")[0];
console.log(`fibo2 Execution time: ${measureFibo2.duration}ms`);
// fibo3 함수의 실행 시간 측정
performance.mark("startFibo3");
console.log(fibo3(20));
performance.mark("endFibo3");
performance.measure("executionTimeFibo3", "startFibo3", "endFibo3");
const measureFibo3 = performance.getEntriesByName("executionTimeFibo3")[0];
console.log(`fibo3 Execution time: ${measureFibo2.duration}ms`);