int fibo(int n) { if (n == 1 || n == 2) return 1; else return fibo(n-1) + fibo(n-2); }
1) 큰 문제를 작은 문제로 나눈다.
2) 이미 구한 값이라면 저장한 값을 이용하고, 구해놓지 않은 값이라면 메모이제이션 배열에 저장한다.
3) 작은 문제의 답을 결합해 큰 문제를 해결한다.
int dp[100] = { 0 }; // 하위 문제 답을 저장할 메모이제이션 배열 int fibo(int n) { if (dp[n] != 0) // 계산한 적이 있는 경우 { return dp[n]; } else // 처음 계산하는 경우 { if (n == 1 || n == 2) { dp[n] = 1; } else { dp[n] = fibo(n-1) + fibo(n-2); } return dp[n]; } } int main() { printf("%d", fibo(5)); return 0; }
1) 작은 문제들부터 푼다.
2) 작은 문제들의 답을 이용해 큰 문제를 푼다.
3) 이를 반복해 최종 문제를 푼다.
int dp[100] = { 0 }; // 하위 문제 답을 저장할 메모이제이션 배열 int fibo(int n) { dp[0] = 0; dp[1] = 1; int i; for (i=2; i<=n; i++) // 2부터 시작해서 n까지 반복 { dp[i] = dp[i-1] + dp[i-2]; } return dp[n]; } int main() { printf("%d", fibo(5)); return 0; }