Python 在gcd算法中无法理解
帮助我们理解这个算法中的一点 为什么Python 在gcd算法中无法理解,python,Python,帮助我们理解这个算法中的一点 为什么b>a在第一次通过a和b时交换位置:(800225) 为什么操作a%b失败 def gcd(a,b): 如果b==0: 归还 其他: 返回gcd(b,a%b) 印刷品(gcd(225800)) 如果b大于a,那么a%b就是a,因为a%b是整数除法余数(模),而a/b是零。我建议您简单地尝试一下:gcd算法的整个思想是用最小的数替换最大的数,用模替换最小的数,如您的示例所示: GCD(225800): 最小的是225 模为'800-3*225',等于125 So
b>a
在第一次通过a
和b
时交换位置:(800225)
为什么操作a%b
失败
def gcd(a,b):
如果b==0:
归还
其他:
返回gcd(b,a%b)
印刷品(gcd(225800))
如果b大于a,那么
a%b
就是a,因为a%b
是整数除法余数(模),而a/b是零。我建议您简单地尝试一下:gcd算法的整个思想是用最小的数替换最大的数,用模替换最小的数,如您的示例所示:
GCD(225800):
最小的是225模为'800-3*225',等于125 So:GCD(225800)=GCD(125225) 从现在开始,你可以继续到最后(模为零) 如果您不检查哪一个是最大的,哪一个是最小的,您将得到: GCD(225800): 模数是225,因为225=0*800+225,所以: GCD(225800)=GCD(225800)
你被卡住了 不确定这是否回答了问题,但如果你问为什么值交换位置,你需要了解欧几里德算法 我们为什么要交换? 下面是我被解释的一种方式: 假设您有两个数字
a
和b
,并且您想要找到GCD。根据定义,GCD是a
和b
除后不带余数的最大数。现在,让我们看看这是如何推理的:
我们可以把a和b之间的关系写成
a = b * c0 + r0
在上面的示例中,c0
和r0
是一些整数,r0
是余数(即r0=a%b
)
我们还可以用类似的方式重写b
和r0
:
b = r0 * c1 + r1
请注意,b
取代了a
,r0
取代了b
。这正是交换步骤。重复此过程,直到rX
变为0(即不存在余数)
假设正确吗?
欧几里德定律的正确性来自这样一个假设:
GCD(a, b) = GCD(b, r)
其中a=b*c+r
。这就是证据:
k
为a
和b
的任何公约数(不一定是最大的)。在这种情况下,a=c1*k
和b=c2*k
,其中c1
和c2
是整数k
也是b
和r
的公约数,因为b
除以k
,如(1)和r=a-b*c=(c1-c2*c)*k
(这只是重新排列了(1)、(2)和原始语句)b
和r
的公约数也是a
和b
的公约数(a,b)
和(b,r)
的所有公约数都重叠。换句话说,元组(a,b)
没有不是(b,r)
的公约数的公约数,反之亦然GCD(a,b)>GCD(b,r)
或GCD(a,b)
将导致前面一个语句中的矛盾。因此,GCD(a,b)
必须等于GCD(b,r)
=>GCD(a,b)=GCD(b,a%b)
查找
a%b
的功能。想想当b>a时,该操作的结果会是什么。当您将其作为第二个参数发送到递归时会发生什么?为什么说a%b
失败?当0时