원래 문제를 풀 수 있을 정도의 작은 크기의 부분 문제들로 분할해 각각 해결한 후, 부분 문제의 해답을 잘 모아 원래 문제의 해답을 얻는 방법
예1: n개의 수 중에서 최대 값 구하기 A: [3, 0, -5, 7, 2, -4, 6 9]
def find_max1(A):
if len(A) == 1: return A[0]
else: return max(A[0], find_max1(A[1:]))
def find_max2(A):
if len(A) < 1: return -infinity
elif len(A) == 1: return A[0]
else: return max(A[:len(A)//2], A[len(A)//2:])
->
2^(k-1) )
def power1(a, n): # 선형 재귀 호출로 작성하기
if n == 1:
return a
return a * power1(a, n-1)
수행시간 점화식: T(n) = T(n-1) + c = O(n)
def power2(a, n): # 이중 재귀 호출로 작성하기
if n == 0: return 1
if n%2 == 1: # n 홀수
return power2(a, n//2)*power(a, n//2)*a
else: # n 짝수
return power2(a, n//2)*power(a, n//2)
수행시간 점화식: T(n) = 2T(n/2) + c = O(n)
power(a, n//2)를 이미 구했는데 여러번 호출하는 것은 비효율적!
변수 p에 저장해놓고 재사용하자!
def power3(a, n): # 선형 재귀 호출이지만, 빠른 방법
if n == 0: return 1
p = power2(a, n//2)
if n%2 == 1: # n 홀수
return p * p * a
else: # n 짝수
return p * p
수행시간 점화식: T(n) = T(n/2) + c = O(log n)
->