2011-01-17 2 views
2

저는 프로젝트 오일러의 문제 중 하나를 근본적으로 해결하고 처음 20 개의 자연수의 LCM을 찾는 것을 목표로하는 코드를 가지고 있습니다.왜 'NoneType'이 파이썬에서 반환됩니까?

def GCD(a, b):    #Euclid's algorithim 
    if (b == 0): 
     return a 
    else: 
     GCD(b, a % b) 

def LCM(a, b):    #LCM(a,b) = a*b/GCD(a,b) 
    x = GCD(a, b) 
    return ((a * b)/x) 

def RFIND(a, b): 
    if (b == 20): 
     return a 
    else: 
     RFIND(LCM(a, b), b + 1) 

print RFIND(2, 1) 

하지만 실행 중에 오류가 발생합니다.

return ((a * b)/x) 
TypeError: unsupported operand type(s) for /: 'int' and 'NoneType' 

이유는 무엇입니까?

답변

14

당신은 재귀 호출에 의해 반환 된 값을 반환해야

def GCD(a, b):    #Euclid's algorithim 
    if (b == 0): 
     return a 
    else: 
     return GCD(b, a % b) 

을보십시오. RFIND에도 비슷한 문제가 있습니다.

+0

그래, 효과가있다. 그러나 나는 그것을 다소 시각적으로 표현할 수 없다. – Shubham

+4

@Shub : GCD에 대한 재귀 호출을하고 있지만 반환하지 않는 경우, 그 호출이 해결되면 else 문으로 인해 void가 반환됩니다. 파이썬에서 당신의 메소드는 아무 것도 반환하지 않고 아무 것도 반환하지 않으면 NoneType을 반환합니다. –

+0

@jesus : 알았어요. 감사.! – Shubham

3

재귀를 잘못 구현했습니다.

def GCD(a, b):    #Euclid's algorithim 
... 
     return GCD(b, a % b) 

def RFIND(a, b): 
... 
     return RFIND(LCM(a, b), b + 1) 
2

NoneType이 아닙니다. None을 반환합니다. 부서에서는 유형을 나누려고하는 유형 인 intNoneType을 어떻게 나누는 지 알지 못합니다. 당신이 그것의 'g'와 6 분할 할 수없는 말을 does't 참조 예를

>>> 'g'/6 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unsupported operand type(s) for /: 'str' and 'int' 

에 대한 시도, 그것은 'STR'과 'INT'나눌 수 없다고. 따라서 :

>>> 1/None 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unsupported operand type(s) for /: 'int' and 'NoneType' 

그리고 다른 사람과 같은

는 이미 여기에 당신이 return 문을 잊고 있기 때문에 None을 반환 지적했다.

관련 문제