我正在尝试使用欧几里得算法来计算两个数字的GCD。 我正在关注this resource。
欧几里得算法说,我们要继续从大数中减去小数,直到两个数相同为止。而不是减去它们,而是在此资源中使用mod。
第一版
def gcd(a, b):
if a == 0 :
return b
return gcd(b%a, a)
第二版
def gcd(a, b):
if (b == 0):
return a
return gcd(b, (a % b))
在两个版本中,代码都不同,但结果却相同。我不知道这是如何工作的。有人可以解释我吗?
答案 0 :(得分:2)
gcd
的每个实现都是另一个的镜像。
在第二个示例中,如果变量a
和b
被交换,则将获得第一个版本。因此,这些gcd
实现是等效的。唯一改变的是a
和b
的顺序。
该算法称为Euclidean division。来自维基百科:
在每个步骤k,欧几里德算法从两个数r k-1 和r计算商q k 和余数r k k-2
r k-2 = q k r k-1 + r k
其中r k 是非负数,并且严格小于r k-1 的绝对值。欧几里得除法定义的基础的定理可确保这样的商和余数始终存在并且是唯一的。
在欧几里得算法的原始版本中,商和余数通过重复减法找到;也就是说,反复从r k-2 中减去r k-1 ,直到剩余的r k 小于r k-。 1 。之后,交换r k 和r k-1 并重复该过程。欧几里得除法将两次交换之间的所有步骤减少为一个步骤,因此效率更高。此外,不需要商,因此可以通过取模运算来代替欧几里得除法,该运算仅给出余数。因此,欧几里得算法的迭代变得简单
r k = r k-2 mod r k-1
答案 1 :(得分:2)
def gcd1(a, b):
if a == 0 :
return b
return gcd(b%a, a)
def gcd2(a, b):
if (b == 0):
return a
return gcd(b, (a % b))
第一个功能和第二个功能完全相同。唯一的区别是参数a
和b
被交换。由于欧几里得算法可以处理任何顺序的输入,因此功能完全相同。