2011-01-17 54 views
2

私は基本的にProject Eulerの問題の1つを解決し、最初の20の自然数のLCMを見つけることを目指すコードを持っています。Pythonで '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を返すことが起こります。 Pythonでは、実行して何も返さない場合、メソッドは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を返し、指摘しました。

関連する問題