큰 문제를 작은 문제로 나눠서 푸는 알고리즘이다.
이 두가지 속성을 만족해야 다이나믹 프로그래밍으로 문제를 풀 수 있다.
문제의 정답을 작은 문제의 정답에서 구할 수 있다.
N-1번째 피보나치 수를 구하는 문제 = N-2번째 피보나치 수를 구하는 문제 + N-3번째 피보나치 수를 구하는 문제
재귀호출을 이용해서 문제를 쉽게 풀 수 있다. 시간복잡도는 채워야하는 칸의 수 X 한 칸을 채우는 복잡도(함수하나의 시간 복잡도)이다.
d = [0] * 100
def fibonacci_recursion(x):
# 1 or 2 는 1
if x == 1 or x == 2:
return 1
# 이미 한번 호출된 적 있는 값은 기억해둔 값 반환
if d[x]!=0:
return d[x]
# 한번도 호출된적 없는 값은 추가
d[x] = fibonacci_recursion(x-1) + fibonacci_recursion(x-2)
return d[x]
print(fibonacci_recursion(6))
d = [0] * 100
def fibonacci_loop(n):
d[1] = 1
d[2] = 1
for i in range(3,n+1):
d[i] = d[i-1]+d[i-2]
print(d[n])