본문 바로가기
Programming/Python

[Python] RecursionError 재귀 디버깅 / 재귀 오류 / 파이썬 오류 해결하기 / 무한루프 함수 종료시키기

by EunjiBest 2022. 5. 28.

[Python] RecursionError 재귀 디버깅 / 재귀 오류 / 파이썬 오류 해결하기 / 무한루프 함수 종료시키기

 

 

 

 

 

요즘 디버깅에 대해서 공부하고 있는데

RecursionError에 대해서는 따로 포스팅을 하고싶어져서 가져와봤다.

무한루프를 돌고있는 함수를 종료시키는 법에 대해서 알아보도록하자.

 

 

 

 

 

Recursion(재귀함수)

 

재귀함수란?

함수 안에서 함수 자기자신을 호출하는 방식이다.

 

꼭 필요하지는 않지만, 긴 코드를 간결하게 줄이기 위해서 사용한다.

간단히 예를 들어보는 함수를 만들어보았다.

 

def hello():
  print('Hello, world!')
  hello()

hello()

 

미친듯이 Hello, world!를 찍어내는 함수가 나온다.

마치 while문에 조건을 걸지 않은 것처럼,

 Hello, world!가 무한루프를 돌다가 오류가 발생한다.

 

아무튼 재귀함수는 함수 안에서 함수 자기자신을 호출하는 것이지만,

조건을 걸지 않으면 무한대로 함수가 호출이 되어서 오류가나게된다.

 

 

 

 

 

RecursionError

 

RecursionError

위 Hello,World!의 예시처럼 조건없이 무한루프를 돌게될 때 나타나게되는

재귀오류이다.

 

RecursionError
: maximum recursion depth exceeded while calling a Python object

 

최대 재귀깊이가 초과됐다. 파이썬 개체(?)를 부르는 동안. 이라는 오류메시지를 읽을 수 있다.

파이썬에서 최대 재귀 깊이(maximum recursion depth)는 1,000으로 정해져있다고 한다.

 

 

 

 

 

재귀 디버깅하기

 

조건을 걸어주기위한 간단한 예시함수를 만들어보자.

 

def sum_to(n):
    return n + sum_to(n - 1)

print(sum_to(5))

 

다음 함수는 0부터 n까지의 합을 구하는 함수이다.

n이 5일 때, 0+1+2+3+4+5 = 15를 리턴한다.

 

 

이런 방식으로 n이 0이 될 때까지만 계산해서 15가 나오는 것을 기대했지만

하지만 실제로 실행을 해보면,

예상했듯이 RecursionError가 나타난다.

 

 

 

재귀함수에서 가장 중요한 것은

1. 종료조건 확인하기이다.

 

def sum_to(n):
    print(n)
    return n + sum_to(n - 1)

print(sum_to(5))

 

일단 함수에 들어가는 인자가 무엇인지 확인하기 위해서

n을 프린트해주었다.

 

 

 

n이 5부터 -957까지 무한루프를 돌다가 에러가 난 것을 확인할 수 있다.

우리는 0부터 5까지 더하는 함수가 필요하기 때문에

0이하의 수는 필요가 없다.

 

def sum_to(n):
    if n <= 0:
      return 0
    return n + sum_to(n - 1)

sum_to(5)

 

따라서,

if문으로 n이 0이하의 수라면 종료한다는 조건을 걸어주어야한다.

그럼 코드가 정상적으로 오류없이 작동하는 것을 볼 수 있다.

 

 

 

 


사실 재귀함수를 말로만 들어본터라

함수 자체를 이해하기 어려워 포스팅해보았다..

 

몇 번을 노트에 적었다 지웠다해가면서

저 함수가 왜 저렇게 돌아가는지 고민을했지만 나름 의미있는 시간이였다.

 

 

 

 

반응형

댓글