분할 정복

$a^n$ 계산하기

  1. 선형 재귀 호출
def power1(a, n):
    if n == 1:
        return a
    return a * power1(a, n - 1)

2. 이진 재귀 호출

def power2(a, n):
    if n == 1:
        return a
    if n == 0:
        return 1
    if n % 2 == 0:
        return power2(a, n // 2) * power2(a, n // 2)
    return power2(a, n // 2) * power2(a, n // 2) * a

3. 더 빠른 이진 재귀 호출

def power3(a, n):
    if n == 0:
        ****return 1
    x = power3(a, n // 2)
    if n % 2 == 0:
        return x * x
    return x * x * a

이진 탐색

def binary_search(A, i, j, x):
    if i > j:   # 탐색 범위 내에 없다
        return None

    m = (i + j) // 2    # 중간 인덱스
    if x == A[m]:   # x 발견
        return m
    elif x < A[m]:  # 왼쪽 반 탐색
        return binary_search(A, i, m - 1, x)
    else:           # 오른쪽 반 탐색
        return binary_search(A, m + 1, j, x)

n번째 피보나치 수 계산 방법