동적계획법을 통해 불필요한 계산을 줄여 효율적으로 최적해를 구할 수 있다.
피보나치 수열은 첫 번째, 두 번째 항이 1이고 나머지 항은 전 항과 전전 항의 값을 더한 값이다.
1 1 2 3 5 8 13 21 34 55 89 144
다음은 재귀를 통해 구현한 n번째 피보나치 수열을 구하는 함수이다.
public static int F(int n) {
if (n <= 2)
return 1;
else
return F(n - 1) + F(n - 2);
}
이 코드의 단점은 불필요한 중복 연산이 많아진다. 다음은 F(6)을 구하는 방식이다.
사진에서 F(3) 연산이 3번, F(4) 연산이 2번이 된 것을 볼 수 있다. 이처럼 같은 연산을 반복하는 것을 볼 수 있다.
이미 했던 연산을 반복하지 않기 위해서 연산 값을 저장하는 배열 Fibo
을 생성한다. Fibo[n]
에 값이 있다면 활용하고, 없다면 계산하여 저장해준다.
//연산 결과 저장 배열
static int[] fibo = new int[100];
public static int F(int n) {
if (n <= 2)
return 1;
if (fibo[n] == 0)
fibo[n] = F(n - 1) + F(n - 2);
return fibo[n];
}
static int[] fibo = new int[100];
public static int F(int n) {
if (n <= 2)
return 1;
//배열에 연산 값이 없으면 계산하여 저장해주기
if (fibo[n] == 0)
fibo[n] = F(n - 1) + F(n - 2);
return fibo[n];
}
static int[] fibo = new int[100];
public static int F(int n) {
fibo[0] = 0;
fibo[1] = 1;
for (int i = 2; i <= n; i++) {
fibo[i] = fibo[i - 1] + fibo[i - 2];
}
return fibo[n];
}
알고리즘 정리해주신거 종종 와서 보는데 제가 본 곳중 여기 정리글이 가장 깔끔하고 이해가 잘되게 정리되어 있어요.. 너무 많은 도움됩니다 감사합니다.!!