了解欧几里得算法在 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 == n
和0 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 算法的工作原理,并且正在寻求了解and
和 or
关键字在 Python 中应用于非布尔值时的工作原理。以上是关于了解欧几里得算法在 Python 中的 GCF 实现的主要内容,如果未能解决你的问题,请参考以下文章
欧几里得算法解决 RR' - NN' = 1. 使用蒙哥马利算法进行模幂运算以在 python 或 Petite Chez 方案中实现费马检验