了解欧几里得算法在 Python 中的 GCF 实现

Posted

技术标签:

【中文标题】了解欧几里得算法在 Python 中的 GCF 实现【英文标题】:Understanding the implementation of Euclid's Algorithm for GCF in Python 【发布时间】:2011-05-27 17:58:24 【问题描述】:

两个数字的 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。但是,一旦我有一对非零整数被比较和/或逻辑,我不明白会发生什么以及为什么。

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

【问题讨论】:

How do "and" and "or" work when combined in one statement?的可能重复 【参考方案1】:

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

0 或 n - 返回 n

0 和 n - 返回 0

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

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

【讨论】:

@Matt - 该部分不是很长,绝对值得一读,因为这是 python 中非常常见的技巧。 @Sanjit 在早期版本中,无论如何 - 在 2.5 及更高版本中,Python 以 'b if a else c' 的形式实现三元运算符。 @Nick:太糟糕了,他们使用了如此可怕的三元语法;它鼓励人们继续使用容易出错的布尔黑客。它是迄今为止 Python 中最荒谬的语法,看似随机地打乱参数并无序地评估其参数。 @Glenn 我认为他们决定的形式非常易读且明确。像这样乱序的子句在英语中很常见(甚至在 Python 中也不是前所未有的——当你看到 [ 时,你不知道它是一个简单的列表还是一个理解,直到你到达 @987654326 @ 或 for),除了 if-then-else 顺序之外,没有什么比这更好读了,它破坏了周围代码的流程。无论如何,任何想对此有所了解的人都可以在此参考python.org/dev/peps/pep-0308,其中记录了决策过程。 @Karl:我不知道“用周围的代码打断流程”是什么意思:cars = traffic()? 100:10; 自然流动,在 Python 中,结果尽可能远离而不是紧挨着每个其他的,我总是不得不读两遍这个表达式,基本上是回溯我的心理解析器。 (谢天谢地,Python 没有在某些语言中发现的 y if x; 暴行,这与三元表达式不同,最终被大量使用。)【参考方案2】:

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

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 为零,所以只会返回 a (14)

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

【讨论】:

【参考方案3】:

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

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

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

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

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

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

【讨论】:

自我测试的问题在于,如果不了解基本推理,事情仍然无法按预期进行。诚然,足够的测试可以将这种可能性缩小到非常小的程度,但它仍然存在。另外,为了在我自己的代码中使用这种结构,我想理解它。谢谢!【参考方案4】:

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

【讨论】:

OP 非常了解 GCF 算法的工作原理,并且正在寻求了解 andor 关键字在 Python 中应用于非布尔值时的工作原理。

以上是关于了解欧几里得算法在 Python 中的 GCF 实现的主要内容,如果未能解决你的问题,请参考以下文章

聚类算法中的四种距离及其python实现

一文了解 Python 中的迭代器 #私藏项目实操分享#

Python中的简单二维聚类算法

Python实现欧几里得算法

欧几里得算法解决 RR' - NN' = 1. 使用蒙哥马利算法进行模幂运算以在 python 或 Petite Chez 方案中实现费马检验

努力理解这段代码如何输出欧几里得算法