调试Python程序LCM

调试Python程序LCM,python,debugging,Python,Debugging,所以我有一个计划: def gcd(x, y): while y % x != 0: y = y % x x = x % y return y def lcm(x, y): (x * y) / gcd(x, y) a = lcm(1, 2) b = lcm(3, a) c = lcm(b, 4) d = lcm(5, c) e = lcm(6, d) f = lcm(e, 7) g = lcm(f, 8) h = lcm(9, g) i =

所以我有一个计划:

def gcd(x, y):
    while y % x != 0:
        y = y % x
        x = x % y
    return y
def lcm(x, y):
    (x * y) / gcd(x, y)
a = lcm(1, 2)
b = lcm(3, a)
c = lcm(b, 4)
d = lcm(5, c)
e = lcm(6, d)
f = lcm(e, 7)
g = lcm(f, 8)
h = lcm(9, g)
i = lcm(h, 10)
j = lcm(11, i)
k = lcm(12, j)
l = lcm(k, 13)
m = lcm(l, 14)
n = lcm(15, m)
o = lcm(n, 16)
p = lcm(17, o)
q = lcm(18, p)
r = lcm(q, 19)
print(lcm(r, 20))
好的,多亏了这篇文章的答案,我现在已经解决了这个问题,但为什么会这样:

def gcd(x, y):
        while y % x != 0:
            y = y % x
            x = x % y
        return y
    def lcm(x, y):
        return (x * y) / gcd(x, y)
    a = lcm(1, 2)
    b = lcm(3, a)
    c = lcm(b, 4)
    d = lcm(5, c)
    e = lcm(6, d)
    f = lcm(e, 7)
    g = lcm(f, 8)
    h = lcm(9, g)
    i = lcm(h, 10)
    j = lcm(11, i)
    k = lcm(12, j)
    l = lcm(k, 13)
    m = lcm(l, 14)
    n = lcm(15, m)
    o = lcm(n, 16)
    p = lcm(17, o)
    q = lcm(18, p)
    r = lcm(q, 19)
    print(lcm(r, 20))
退回这个:

ZeroDivisonError: float modulo
抱怨第二行,我想我可能需要某种
if
语句来排列这两个数字。 有人知道为什么会发生这种情况吗?

谢谢。

您忘了在
lcm
功能中返回
一些内容

def lcm(x, y):
    return (x * y) / gcd(x, y)
当函数中没有显式返回任何内容时,Python会自动返回
None
。当您尝试
lcm(r,20)
时,这与
lcm(None,20)
相同,这不起作用,因为您在
lcm
函数中将两个参数相乘-您无法执行
None*20

但是,这将产生另一个错误-您的
gcd
函数也有问题

y%x
0
时,会出现错误,然后您立即执行
x%y
。这将是一个有效的解决办法:

def gcd(x, y):
    while y != 0:
        x, y = y, x % y
    return x

这直接取自维基百科文章(第2.2节)。

这里有一个误解。当您在
lcm()
中使用
gcd()
时,您正在创建嵌套环境
gcd()
的环境无法访问全局环境。它返回的任何内容都可以通过
lcm()
的环境访问。您在
lcm()
中不向全局环境返回任何内容,因此python默认返回
None
。若要修复此问题,请尝试:

def lcm(x, y):
    return (x * y) / gcd(x, y)
此外,您还必须将此块添加到
lcm()
以避免引发
ZeroDivision
异常:

def lcm(x, y):
    try:
        return (x * y) / gcd(x, y)
    except ZeroDivisionError:
        do whatever you want and return a value 

好的,但是现在它返回的是
ZeroDivisionError:float modulo
@user2128561这是因为你的
gcd
函数被弄乱了。顺便说一句,解决这个问题的捷径是
functools.reduce(lcm,range(1,21))
如果它抱怨第二行,那么在某个点上
x==0
,您试图
y%x
-也就是说
y%0
,这将给出错误。