Fibonacci using Memoization
Legacy Fibonacci
def fibo(n):
return n if n < 2 else fibo(n-2) + fibo(n-1)
def Main():
number = int(input("Enter integer: "))
print(fibo(number))
if __name__=='__main__':
Main()
Fibonacci using Memoization
__fibo_cache = {}
def fibo(n):
if n in __fibo_cache:
return __fibo_cache[n]
else:
__fibo_cache[n] = n if n < 2 else fibo(n-2) + fibo(n-1)
return __fibo_cache[n]
def Main():
number = int(input("Enter integer: "))
print(fibo(number))
if __name__=='__main__':
Main()
위 소스를 기준으로 fibo(5) 을 구한다고 가정하면 아래와 같은 순서로 memoization 을 수행한다.
- call fibo(5) -> 5 is not in __fibo_cache -> fibo(3) + fibo(4)
- call fibo(3) -> 3 is not in __fibo_cache -> fibo(1) + fibo(2)
- call fibo(1) -> 1 is not in __fibo_cache -> __fibo_cache[1] = 1 memo
- call fibo(2) -> 2 is not in __fibo_cache -> __fibo_cache[2] = 2 memo
- __fibo_cache[3] = 1 + 2 = 3 memo
- call fibo(4) -> 4 is not in __fibo_cache -> fibo(2) + fibo(3)
- 2,3 is in __fibo_cache -> __fibo_cache[4] = 2 + 3 = 5 memo
- __fibo_cache[5] = 3 + 5 = 8 memo
중복해서 계산이 필요한 부분은 memo를 해두고 그것을 찾아볾으로써 불필요한 연산을 줄여줄 수 있다.
Fibonacci using memoization and decorator
Python의 Decorator를 이용하면 아래와 같이 좀 더 그럴싸하게 구현할 수 있다.
def memoize(f):
cache = {}
def decorated_function(*args):
if args in cache:
return cache[args]
else:
cache[args] = f(*args)
return cache[args]
return decorated_function
@memoize
def fibo(n):
return n if n < 2 else fibo(n-2) + fibo(n-1)
def Main():
number = int(input("Enter integer: "))
print(fibo(number))
if __name__=='__main__':
Main()
소스코드 출처: http://ujihisa.blogspot.com/2010/11/memoized-recursive-fibonacci-in-python.html