[英]Understanding the implementation of Euclid's Algorithm for GCF in Python
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 == n
和0 and n == 0
。 但是,一旦我将一对非零整数与逻辑和/或逻辑进行比较,我不明白发生了什么以及为什么。
有人可以引导我完成这个功能吗?
Python布尔运算符'或'和'和'不返回布尔值。 他们返回他们正在比较的值之一。
0或n - 返回n
0和n - 返回0
a and b or c
只是在C中实现(a ? b : c)
语法的技巧。
阅读Dive into Python的 4.6节,了解python的布尔操作和这个技巧。
在您的情况下,调用堆栈将如下所示:
gcf(42,56)
gcf(56,42)//由于b非零,将递归并通过42%56(= 42)作为第二个arg
gcf(42,14)//因为b非零,将递归并通过56%42(= 14)作为第二个arg
gcf(14,0)//因为b非零,将递归并传递42%14(= 0)作为第二个arg
返回//因为b为零,只返回一个(14)
这将一直弹到顶部。 在python中,和将返回数字而不是布尔值,这就是为什么弹出返回结果而不是1 / true。
但是,一旦我将一对非零整数与逻辑和/或逻辑进行比较,我不明白发生了什么以及为什么。
会发生什么是返回影响结果的第一个值。
只要if x:
block中的代码运行, x or y
- >计算结果为x
,否则计算结果为y
。
只要if x:
block中的代码不运行, x and y
- >计算结果为x
,否则计算结果为y
。
为什么会这样,是因为GvR这么说。 它可能正是使这个技巧发挥作用,回到x if C else y
之前, x if C else y
结构添加到语言中。
但是,你知道......你本可以亲自测试一下。 这就是REPL的用途:)
如果b不等于零,则结果为gcf(b,a%b)(递归)。 如果b等于零,则结果为a。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.