nephtys   6년 전

별로 런타임 에러가 날만한 부분이 없는 것 같은데...

list의 크기? 0으로 나누기? 여러 가지 생각을 해 보았으나 잘 해결되지 않네요 ㅠ.ㅠ

고수분들 도와주세요!

indioindio   6년 전

def gcd(a, b):

     while b:

         a, b = b, a % b

    return a

재귀대신 while 문을 활용한 유클리드 알고리즘을 사용하였을 때 통과된 걸로 보아 (확인 차 제출해본 점 양해 부탁드립니다) 재귀함수가 1000번 이상 스택에 쌓여서 그런 것 같네요. 

이 한계는 sys.setrecursionlimit(number)으로 증가 시킬 수 있습니다.

그리고 여담이지만

result = (a[i] * b[i]) // temp로 나누기의 몫만 정수형으로 취하도록 하는 것이 나을 것 같습니다.

indioindio   6년 전

아하 재귀가 문제이긴 했으나 recursion limit과는 상관이 없었군요. 45000으로는 절대 천번이상 쌓일리가 없어서 이상하다고 생각했었는데..

값의 비교로 is를 사용하셨는데, (if b is 0) 
is 키워드는 값의 비교가 아니라 reference 비교를 할 때 사용됩니다.(id(b) == id(0)) 즉 b가 가르키는 주소가 상수 0의 메모리 주소와 같을 때는 b is 0이 True를 반환합니다. b의 값이 0이지만 다른 주소에 있다면 False를 반환하구요.
 다만 파이썬은 최적화를 위해 -5 ~ 256 사이의 값은 항상 같은 메모리주소를 갖도록 한다고 하던데 이건 내부 구현사항일 뿐이니 이것에 의존하여 b is 0을 사용하시면 안 될 것 같습니다.
b == 0을 사용하면 통과하네요.


http://stackoverflow.com/questions/306313/is-opera...

nephtys   6년 전

와 정말 감사합니다. 파이썬에 대한 저의 무지로 일어난 문제였군요... ㅠㅠ (// operator가 있는 것도 덕분에 처음 알게 되었습니다.)

is의 용법도 제가 알고 있는 거랑 다르군요. 덕분에 많이 배워갑니다.

친절한 답변 정말 감사드립니다. 더 열심히 공부할 수 있는 밑거름으로 삼겠습니다. 재귀에 대한 통찰력도 한 수 배워갑니다.

댓글을 작성하려면 로그인해야 합니다.