더북(TheBook)

스택 프레임은 메모리에 생성되는데 생성될 수 있는 크기에 한계가 있습니다. 그러므로 계속 쌓인다면 언젠가는 최대 한계치에 도달할 수밖에 없지요. 이때 발생하는 에러가 Recursion Depth 에러입니다. 이를 방지하려면 함수 호출을 막아 줄 기저 사례가 필요합니다. 기저 사례는 전달받은 매개변수 값이 특정 값에 도달하면 함수가 호출되는 것을 막아 줍니다. 함수 구조를 살펴보면, 보통은 호출 코드가 있는 부분으로 가지 않고 계산된 값을 반환하며 함수를 종료합니다. 팩토리얼에서 이 특정 조건은 0!=1이므로 이 조건을 기저 사례로 사용할 수 있습니다.

기저 사례의 개념을 이해했으니, 어떻게 기저 사례를 설계해야 하는지 ‘재귀 함수가 자기 스스로를 호출할 때 전달하는 인수’ 부분을 살펴봅시다. 코드 1-2를 다시 살펴보겠습니다.

코드 1-4 1-2 다시 살펴보기

def factorial(n):
    # base case
    if n <= 0: # 1
        return 1
    return n*factorial(n-1) # 2

if __name__ == "__main__":
    for i in range(1, 6):
        print(factorial(i))

코드 1-4에서 # 2를 볼까요? 재귀 함수가 실행 중 자기 자신을 호출할 때 인수 크기는 줄어듭니다. 함수를 호출하는 factorial의 인수 n3이었다면 호출된 factorial에는 n-1이 인수로 전달되므로 호출된 factorial 스택 프레임에는 매개변수 n2가 될 것입니다. 그렇게 하나씩 매개변수 크기가 줄어들다 보면 언젠가는 n이 기저 사례에 해당하는 순간이 올 것입니다. 그러면 더 이상 자기 스스로를 호출하지 않겠지요.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.