为什么';非类型';是用Python返回的吗?

为什么';非类型';是用Python返回的吗?,python,Python,我有一个代码基本上解决了Euler项目中的一个问题,旨在找出前20个自然数的LCM 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)

我有一个代码基本上解决了Euler项目中的一个问题,旨在找出前20个自然数的LCM

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'
我可以知道为什么吗

试试看

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

您必须返回递归调用返回的值
RFIND
也有类似的问题。

您不正确地实现了递归

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

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

它不返回
NoneType
。它正在返回
None
。分区表示它不知道如何划分类型
int
NoneType
,因为这是您试图划分的类型。举个例子

>>> 'g'/6
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for /: 'str' and 'int'
>>'g'/6
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:/:“str”和“int”的操作数类型不受支持
正如你们看到的,它并没有说它不能除‘g’和‘6’,而是说它不能除‘str’和‘int’。因此:

>>> 1/None
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for /: 'int' and 'NoneType'
>1/无
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:/:“int”和“NoneType”的操作数类型不受支持

正如这里的其他人已经指出的,它返回
None
,因为您忘记了
return
语句。

是的,这很有效。但是我有点无法正确地想象它。@Shub:发生的是,您正在对GCD进行递归调用,但没有返回它,发生的是,当该调用得到解决时,由于您的else语句,它返回void。在Python中,如果方法执行时不返回任何内容,那么它将返回NoneType。