
def fibo(x) :
if (x == 1 or x == 2) :
return 1
return fibo(x-1) + fibo(x-2)
printf(fibo(4))

Memoization
DP를 구현하는 방법 중 한 종류로,
한 번 구한 결과를 메모리 공간에 저장해두고, 같은 식을 다시 호출하면
메모한 결과를 그대로 가져오는 기법.
= 메모이제이션 = 캐싱 Caching
예시) 피보나치 + 메모이제이션
# 한 번 계산된 결과를 Memoization하기 위한 리스트 초기화
d = [0]*100
# 재귀함수로 피보나치 구현 (top-down형식)
def fibo(x) :
# 종료조건 = 1이거나 2일때
if x == 1 or x == 2 :
return 1
# 이미 계산한 적 있는 문제라면 그대로 반환
if d[x] != 0 :
return d[x]
# 아직 계산하지 않은 문제라면 점화식에 따라서 피보나치 결과 반환
d[x] = fibo(x-1) + fibo(x-2)
return d[x]
print(fibo(99))
dynamic programming 사용 조건
1. 큰 문제를 작은 문제로 나눌 수 있다.
2. 작은 문제에서 구한 정답은 그것을 포함하는 큰 문제에서도 동일하다.
| divide and conquer | dynamic programming |
|---|---|
| 한번 pivot 원소가 자리를 변경해서 자리 잡게 되면, 그 기준 원소의 위치는 더이상 바뀌지 않고 그 피벗값을 다시 처리하는 부분 문제는 존재하지 않는다. | 한번 해결했던 문제를 다시해결한다. 이미 해결된 부분 문제에 대한 답을 저장해 놓고, 이 문제는 이미 해결이 됐던 것이니 다시 풀 필요가 없다고 반환한다. |
재귀 함수 사용시, 컴퓨터 시스템에는 함수를 다시 호출했을때
메모리 상에 적재되는 일련의 과정을 따라야해서 오버헤드가 발생할 수도
때문에 일반적으로 재귀보다 반복문이 DP에서 성능이 좋다.
재귀함수의 스택 크기가 한정되어있을 수도 있다.
(sys라이브러리의 setrecursionlimit()을 이용해 재귀 제한 완화 가능하긴 함)