这个最大的公约数(gcd)如何在python中运行

时间:2011-06-29 06:29:55

标签: python

我从http://www.s-anand.net/euler.html获取了一段代码,问题5:

def gcd(a,b): 
    print a,b
    return b and gcd(b, a % b) or a

print gcd(10,20)

给出输出:

10 20

20 10

10 0

10

为什么最后一行只打印“a”而不是b。

请解释一下上述代码中的return语句是如何工作的。

我对“和”和“或”操作符感到困惑。

3 个答案:

答案 0 :(得分:6)

Python的andor运算符使用的short-circut evaluation类型一开始有点令人困惑。

如果它们是作为函数编写的,它们会像这样工作,除非他们甚至不评估正确的值,除非他们需要。

def and(left, right):
    if left:
        return right
    else:
        return left

def or(left, right):
    if left:
        return left
    else:
        return right

所以行return b and gcd(b, a % b) or a可以更详细地写成:

if b:
    temp_1 = gcd(b, a % b)
else:
    temp_1 = False

if temp_1:
    return temp_1
else:
    return a

如果你计算出逻辑,这相当于找到GCD的常用方法。但是,除非您已熟悉Python,否则此代码将难以阅读,因此您可能希望避免使用此样式。

答案 1 :(得分:6)

b and gcd(b, a % b) or a

是旧的写作方式:

gcd(b, a % b) if b else a

答案 2 :(得分:3)

因为10是你案件中最大的公约数,例如结果gcd(10,20)

您的代码(返回b和gcd(...)或a)与:

相同
def gcd(a,b): 
    print a,b
    if b:
        return b      
    else:
        res = gcd(b, a % b)
        return res if res else a

另请注意gcd method in fractions module

from fractions import gcd
print gcd(10,20)