[동적 프로그래밍] 피보나치 수열 문제 이론 (파이썬)- Statssy


동적 프로그래밍에 관하여

프로그래머스 그리디 문제를 다 풀고 이번에는 동적 프로그래밍이라는 것이 나왔다. 일단 대충 어떤 느낌인지 써보겠다.

  • 탐욕법 : 순간순간 최적의 길찾기
  • 동적 프로그래밍 : 전체 문제를 하위 문제로 나누고 하위 문제를 결합하여 최종 문제 해결. 중요한건 메모이제이션! 답을 기억해 놓아서 또 다시 풀지않게 하는것

그렇다면 이번에는 피보나치 수열 문제를 처음에는 재귀로 풀어보고 나중에는 동적 프로그래밍으로 풀어보겠다.

재귀로 피보나치 수열 풀기

def fibonacci(a,b):
    print(a)
    return fibonacci(b,a+b)

피보나치 수열에서 재귀를 멈추게끔 세팅하기

def fibonacci(a,b,c):
    print(a)
    if c == 0:
        return a
    return fibonacci(b, a+b, c-1)
fibonacci(0,1,10)
0
1
1
2
3
5
8
13
21
34
55





55

효율성이 떨어지는 모델 (재귀 + 함수 2개)

  • 계산이 엄청 나게 많이 됨
def fibo(n):
    # print(n)
    # 이 프린트 문을 이용하면 얼마나 많은 계산을 하는 지 알 수 있다.
    if n < 2:
        return n
    else:
        return fibo(n-1) + fibo(n-2)

print(fibo(10)) # 55
55

피보나치 수열 동적 프로그래밍으로 풀기

  • 간단한 하위 문제를 해결하면서 좀 더 복잡한 상위 문제로 나아감
  • 하위 문제를 해결한 결과는 저장
  • 전체 문제를 해결할 때 까지 반복
def dyn_fibo(n):
    val = [0,1]
    if n < 2:
        return val[n]
    else:
        for i in range(2, n+1):
            val.append(val[i-1] + val[i-2])
        return val[n]

print(dyn_fibo(10)) # 55
55

동적 프로그래밍 + 슬라이딩 윈도 기법 (v0, v1, v2 돌려막기)

def fib2(n):
    if n < 2:
        return n
    v0, v1 = 0, 1
    for _ in range(n-1):
        v2 = v1 + v0
    return v2

for i in range(11):
    print(fib2(i))
0
1
1
2
3
5
8
13
21
34
55

참고 사이트를 참고하였다.




© 2018. by statssy

Powered by statssy