본문 바로가기
카테고리 없음

파이썬 ‘RecursionError’ 오류 해결법: 재귀 함수 무한 호출 문제

by vibespace 2025. 5. 22.

파이썬에서 ‘RecursionError’ 오류란?

파이썬에서 ‘RecursionError’ 오류는 재귀 함수가 과도하게 호출될 때 발생하는 오류입니다. 재귀 함수는 자기 자신을 반복적으로 호출하는 함수로, 종료 조건이 없거나 너무 깊은 호출을 할 경우 이 오류가 발생할 수 있습니다. 이 글에서는 ‘RecursionError’ 오류의 원인과 이를 해결하는 방법에 대해 자세히 알아보겠습니다.

‘RecursionError’ 오류의 원인

‘RecursionError’ 오류는 주로 재귀 함수가 끝나지 않고 무한 호출을 반복하거나, 재귀의 깊이가 너무 깊어져서 발생합니다. 재귀 함수가 종료 조건을 제대로 설정하지 않거나, 함수 호출의 깊이가 너무 많을 때 이 오류가 발생합니다.

  • 종료 조건 누락: 재귀 함수가 종료되는 조건이 제대로 설정되지 않으면, 함수는 계속해서 자신을 호출하게 되어 ‘RecursionError’가 발생합니다.
  • 너무 깊은 재귀 호출: 파이썬은 기본적으로 재귀 호출의 깊이를 제한합니다. 이 제한을 초과하면 ‘RecursionError’가 발생하게 됩니다. 기본적으로 파이썬의 재귀 깊이는 1000회로 제한되어 있습니다.
  • 잘못된 재귀 설계: 재귀 함수의 설계 자체가 잘못되어 종료 조건을 지나치게 복잡하게 설정했거나, 일부 경로에서 조건을 잘못 지정할 수 있습니다.

‘RecursionError’ 오류 해결 방법

‘RecursionError’ 오류를 해결하는 방법은 주로 재귀 함수의 종료 조건을 정확히 설정하거나, 재귀 호출의 깊이를 조절하는 것입니다. 아래에서는 오류를 해결할 수 있는 몇 가지 방법을 소개합니다.

1. 종료 조건 명확히 설정하기

재귀 함수는 반드시 종료 조건을 명확히 설정해야 합니다. 종료 조건이 없으면 함수는 무한히 자신을 호출하게 되어 ‘RecursionError’가 발생합니다. 아래 예시를 보겠습니다:

def factorial(n):
    if n == 0:  # 종료 조건
        return 1
    else:
        return n * factorial(n - 1)

print(factorial(5))

위 코드에서 if n == 0 조건은 재귀 함수가 종료되도록 보장합니다. 종료 조건을 명확하게 설정하는 것이 중요합니다.

2. 재귀 깊이 조절하기

파이썬은 기본적으로 재귀 함수 호출의 깊이를 1000번으로 제한합니다. 만약 더 깊은 재귀가 필요하다면, sys.setrecursionlimit() 함수를 사용하여 제한을 늘릴 수 있습니다. 다만, 지나치게 깊은 재귀 호출은 스택 오버플로우를 유발할 수 있으므로 주의가 필요합니다.

import sys
sys.setrecursionlimit(2000)  # 재귀 깊이를 2000으로 설정

위와 같이 재귀 깊이를 설정할 수 있지만, 재귀 함수의 설계를 변경하는 것이 더 좋은 방법일 수 있습니다. 재귀 깊이를 너무 깊게 설정하는 것보다는 다른 해결 방법을 고려하는 것이 좋습니다.

3. 반복문으로 변경하기

재귀를 반복문으로 바꾸는 것도 좋은 해결책입니다. 반복문을 사용하면 스택을 사용하지 않기 때문에 메모리 사용을 줄이고, 깊은 재귀 호출로 인한 오류를 예방할 수 있습니다. 아래는 재귀 함수 대신 반복문을 사용하는 예시입니다:

def factorial(n):
    result = 1
    for i in range(1, n + 1):
        result *= i
    return result

print(factorial(5))

위 예시에서는 재귀 대신 반복문을 사용하여 팩토리얼을 계산하고 있습니다. 이렇게 하면 재귀 깊이에 의한 오류를 피할 수 있습니다.

4. 꼬리 재귀 최적화 사용하기

파이썬은 기본적으로 꼬리 재귀 최적화를 지원하지 않지만, 꼬리 재귀를 활용한 방식으로 재귀 함수를 설계하면 일부 언어에서는 더 효율적인 메모리 사용이 가능합니다. 파이썬에서 꼬리 재귀 최적화는 자동으로 이루어지지 않기 때문에 반복문을 사용하는 방법을 권장합니다.

‘RecursionError’ 오류 예방을 위한 팁

‘RecursionError’ 오류를 예방하려면 재귀 함수의 설계를 신중히 고려하고, 종료 조건을 명확히 설정하는 것이 중요합니다. 아래는 재귀 오류를 예방하기 위한 몇 가지 팁입니다:

  • 재귀 함수가 종료되는 명확한 조건을 설정하세요.
  • 재귀 깊이가 너무 깊어지지 않도록 함수를 설계하세요.
  • 가능하다면 재귀 대신 반복문을 사용하세요.
  • 재귀 깊이를 늘려야 할 경우 sys.setrecursionlimit() 함수를 사용하되, 너무 깊게 설정하지 않도록 주의하세요.

결론

‘RecursionError’ 오류는 재귀 함수가 종료 조건 없이 무한 호출되거나, 재귀 깊이가 너무 깊어질 때 발생합니다. 이 오류를 해결하기 위해서는 종료 조건을 명확히 설정하고, 필요하다면 재귀를 반복문으로 바꾸는 방법이 있습니다. 또한, 재귀 깊이를 늘릴 수 있는 방법도 있지만, 재귀 설계를 최적화하는 것이 더 좋은 해결책일 수 있습니다. 이러한 방법들을 통해 ‘RecursionError’ 오류를 예방하고, 파이썬에서 안전하게 재귀 함수를 사용할 수 있습니다.