개념

재귀적 문제 해결 (또는 재귀 함수를 이용한 문제 해결) 초기 값 + 점화 식의 느낌, 점화 식이 재귀 함수가 됨 초기 값을 이용해 작은 부분의 문제를 먼저 해결한 후 그 결과 값을 이용해 큰 문제를 차차 해결해 간다는 면에서 DP와도 관련 깊음

장점

프로그램 크기가 작아지고, 구현이 간단

단점

디버깅이 어렵고,, 했던 계산 또 하면서 수행 시간이 길어짐 (Overhead 간접 자원 증가)

Memoization

memo’r’ization 아님에 주의 함수 계산을 반복함으로써 수행 시간이 길어지는 단점을 보완하기 위해, 초기 값에서 시작해 계산된 값들을 미리 메모리에 저장하는 기법 - 즉 재귀 함수를 돌리는 대신 바로 메모리에서 이전 값 꺼내 씀 DFS

예시

팩토리얼

n! = ((n-1)까지의 값) 곱하기 n 즉 점화식은 n>=2일 때 f(n) = f(n-1) * n memoization 쓰면 f(n) 나올 때 마다 리스트에 n번째 (index n)로 저장해서 바로바로 사용 가능 ex) factorial = [0, 1, 2, 6...],

피보나치 수

점화식은 n>=2일 때 f(n) = f(n-1) + f(n-2)

 
 
 
 
 
def fibo (n):
 
	if n >= 2: 
	# 이미 계산 했던 값 계산하고 또 하고...
		return fibo1(n-1) + fibo1(n-2)
	else:
		return n
	```
 
memoization 사용하면 이런 느낌
 
```python
 
 
 
 
memo = [0, 1]
def fibo1 (n):
	global memo
	if n >= 2 and len(memo)<=n: 
	# len(memo)<=n 이게 중요한 게, 저장 안 된 fibo1(n)만 새로 저장시킴
		return fibo1(n-1) + fibo1(n-2)
	else:
		return memo[n]
	

하지만 memoization보다 더 효율적인 방법(DP)도 있다 이 방법은 위처럼 글로벌 데이터베이스를 만들어 함수를 호출하지 않고, 한 함수 그 계산만 반복한다 - 함수 stack에서 call 하는 등 부가적인 시간이 들지 않는다

 
def fibo2(n):
	memo = [0, 1]
	for i in range (2, n+1):
		memo.append(memo[i-1]+memo[i-2]) # 즉 함수의 역할을 list가 해 줌
		return  memo[n]
		```