理解Python中用于GCD的Euclid算法的实现

时间:2010-12-19 02:28:05

标签: python algorithm factorization

Euclid的两个数字的GCF算法是:GCF(a, b)=GCF(b, a mod b)。我已经看到这在Python中实现如下:

def gcf(a, b):
    return b and gcf(b, a%b) or a

我不明白如何解析这个函数或具体如何将布尔逻辑应用于整数。例如,gcf(42, 56) = 14。当我走过它时,我看到最终递归部分返回零。我按照0 or n == n0 and n == 0进行操作。但是,一旦我将一对非零整数与逻辑和/或逻辑进行比较,我不明白发生了什么以及为什么。

有人可以引导我完成这个功能吗?

4 个答案:

答案 0 :(得分:2)

Python布尔运算符'或'和'和'不返回布尔值。他们返回他们正在比较的一个值。

0或n - 返回n

0和n - 返回0

a and b or c只是在C中实现(a ? b : c)语法的技巧。

阅读Dive into Python的4.6节,了解python的布尔运算和这个技巧。

答案 1 :(得分:1)

在您的情况下,调用堆栈将如下所示:

gcf(42,56)
gcf(56,42)//由于b非零,将递归并传递42%56(= 42)作为第二个参数
gcf(42,14)//由于b非零,将递归并传递56%42(= 14)作为第二个参数
gcf(14,0)//因为b非零,将递归并传递42%14(= 0)作为第二个参数
返回//因为b为零,只返回一个(14)

这将一直弹到顶部。在python中,和将返回数字而不是布尔值,这就是为什么弹出返回结果而不是1 / true。

答案 2 :(得分:1)

  

然而,一旦我将一对非零整数与逻辑和/或逻辑进行比较,我不明白发生了什么以及为什么。

发生什么是返回影响结果的第一个值。

x or y - >每当x块中的代码运行时评估为if x:,否则评估为y

x and y - >只要x块中的代码运行,评估结果为if x:,否则评估为y

为什么发生这种情况是因为GvR这么说。在将x if C else y构造添加到语言之前,可能正好可以使这个技巧发挥作用。

但是,你知道......你本可以亲自测试一下。这就是REPL的用途:)

答案 3 :(得分:0)

如果b不等于零,则结果为gcf(b,a%b)(递归)。如果b等于零,则结果为a。