调试Python程序LCM

时间:2013-03-03 09:53:16

标签: 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 = 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语句来将这两个数字按顺序排列。 任何人都知道为什么会发生这种情况? 感谢。

2 个答案:

答案 0 :(得分:2)

您忘记了return函数中的lcm内容。

def lcm(x, y):
    return (x * y) / gcd(x, y)

如果没有在函数中显式返回任何内容,Python会自动返回None。当您尝试lcm(r, 20)时,lcm(None, 20)lcm相同,由于您在None * 20函数中将两个参数相乘,因此无法正常工作 - 您无法gcd。< / p>

然而,这会产生另一个错误 - 您的y % x功能也存在问题!

0x % y时出现错误,然后您就会def gcd(x, y): while y != 0: x, y = y, x % y return x 。这将是一个有效的解决方案:

{{1}}

这是直接来自维基百科文章(第2.2节)中的Euclid's algorithm

答案 1 :(得分:0)

这里存在误解。当您在gcd()内使用lcm()时,您正在创建嵌套环境。 gcd()的环境无法访问全局环境。它返回的任何内容都可以被lcm()的环境访问。您不会在{{1}中向全局环境返回任何内容。因此,python默认返回lcm()。来修复此尝试:

None

您还必须将此块添加到def lcm(x, y): return (x * y) / gcd(x, y) 以避免抛出lcm()例外:

ZeroDivision