3

两个数的 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

4 回答 4

2

Python 布尔运算符 'or' 和 'and' 不返回布尔值。它们返回它们正在比较的值之一。

0 或 n - 返回 n

0 和 n - 返回 0

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

阅读Dive into Python的第 4.6 节,以获得对 python 的布尔运算和这个技巧的详细描述。

于 2010-12-19T02:39:13.960 回答
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) 作为第二个参数
return a // 因为 b 是零,只会返回 (14)

这将一直弹出到顶部。在 python 中,and 将返回数字而不是布尔值,这就是弹出返回结果而不是 1/true 的原因。

于 2010-12-19T02:54:35.423 回答
1

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

发生的情况是返回影响结果的第一个值。

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

x and y->x每当if x:块中的代码无法运行时计算为 ,否则计算为y.

为什么会发生这种情况是因为 GvR 这么说的。很可能,在将x if C else y结构添加到语言之前,它可能正是为了使这个技巧起作用。

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

于 2010-12-19T05:15:38.827 回答
0

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

于 2010-12-19T02:39:41.183 回答