Trouble shootings, RecursionError

markyang92·2021년 8월 1일
0

python

목록 보기
1/42
post-thumbnail
post-custom-banner

'_ctypes' 모듈

  1. system에 libffi-devel이 없어서 생기는 문제

해결책 1.

  1. 현재 pyenv혹은 사용하는 python version을 체크하고
$ pyenv versions

  1. libffi-dev 패키지 설치
$ sudo apt update && sudo apt install libffi-dev
  1. 현재 사용하는 python version 환경을 지우고 재 설치
    3-1. 본인은 pyenv를 사용하므로 아래의 명령으로 파이썬 지우고 재설치
$ pyenv uninstall <Current Version>
$ pyenv install <Current Version>

재귀 문제

  • RecursionError는 재귀와 관련된 에러
  • Python이 정한 최대 재귀 깊이는 sys.getrecursionlimit()을 이용해 확인할 수 있다.
    • BOJ 사이트의 채점 서버에서 재귀 허용 값은 1,000 이다.
  • 내 시스템

    나도 1000이다.

재귀 깊이 측정

  • print(calc(n))함수는 n=1000 일 때, 1002 개 스택을 사용한다.

방법 1. 재귀 깊이 변경

import sys
sys.setrecursionlimit(10**6)
  • 내 시스템에서 재귀 깊이를 106{10^6}으로 설정하였다.

방법 2. DFS -> BFS

방법 3. DP(재귀) -> DP(반복문)


방법 4. 재귀 횟수 제한

def bomb(head,depth):	# 재귀에 depth를 준다.
    origin_move=ball_list[head].num
    result.append(ball_list[head].origin_idx)
    del ball_list[head]
    if len(ball_list) == 0:
        return 0 # 재귀를 더 할 필요가 없으면 return 0
    ...중략...
    if depth == 500:	# depth 가 500이면
        return target	# 가져갈 정보를 return
    return bomb(target,depth+1) # 기본적으로 depth+1을 inherit해준다.

target=bomb(0,1) # return == 0: 끝, return != 0: return target으로 인한 재귀 나가기
# return 값으로 챙길 정보를 챙기고
while True:
    if target==0:
        break
    else:
        target=bomb(target,1) # 다시 재귀
profile
pllpokko@alumni.kaist.ac.kr
post-custom-banner

0개의 댓글