在数学中,两个或两个以上整数的最大公约数(gcd),当其中至少有一个不是零时,是除数字而没有余数的最大正整数。例如,8和12的GCD是4。维基百科
以下方法能够确定GCD:
def gcd(a, b)
if a % b == 0
b
else
gcd(b, a % b)
end
end
p gcd(4, 12)
#=> 4
这种方法是如何工作的?
如果a%b==0
那么b
是可以同时进入a
和b
的最大数字。
但是为什么要再次调用相同的方法,但要切换参数,再次取模呢?
我不是在摸索其他
部分背后的推理。
编辑:
添加一些put
语句以使其更清晰:
def gcd(a, b)
puts "Inside gcd, a: #{a}, b: #{b}, a \% b: #{a % b}"
if a % b == 0
puts "Inside if, a: #{a}, b: #{b}, a \% b: #{a % b}"
b
else
puts "Inside else, a: #{a}, b: #{b}, a \% b: #{a % b}"
gcd(b, a % b)
end
end
p gcd(55, 105)
stdout:
Inside gcd, a: 55, b: 105, a % b: 55
Inside else, a: 55, b: 105, a % b: 55
Inside gcd, a: 105, b: 55, a % b: 50
Inside else, a: 105, b: 55, a % b: 50
Inside gcd, a: 55, b: 50, a % b: 5
Inside else, a: 55, b: 50, a % b: 5
Inside gcd, a: 50, b: 5, a % b: 0
Inside if, a: 50, b: 5, a % b: 0
5
关键的事实是,对于b的每一个除数g,我们有g除a当且仅当g除a%b(特别是,这对GCD适用)。这是由a=(a/b)*b a%b表示的,其中/是整数除法,因为g除以a(分别为a%b),而g除以b的所有倍数,包括(a/b)*b,因此g除以a%b(分别为a)。因此,如果递归调用终止,它会给出正确的结果,因为我们总是减少输入的大小(根调用除外)。
切换参数的原因是,较大的数字是第一个参数,因为0
这就是所谓的欧几里德算法。
为了理解为什么你需要交换数字并进行另一个递归调用,你需要理解它背后的实际数学是什么。看看这个YouTube视频,看看欧几里得算法是如何工作的。否则,我在下面写了我对算法的解释。
输入
输出
内部计算
例如:
gcd(40,7)
40 = 7(5) + 5
7 = 5(1) + 2
5 = 2(2) + 1 <-- your gcd
2 = 1(2) + 0
但是,这意味着...
gcd(40,7) = gcd(7, gcd(40,7)) =
gcd(7, 5) = gcd(5, gcd(7, 5)) =
gcd(5, 2) = gcd(2, gcd(5, 2)) =
gcd(2, 1) = 0
当gcd(a,b)=0时,b等于1,所以我们返回b
这是最重要的部分!如果我们不交换数字,我们就不能进行必要的数学运算,最终,跟踪b的位置,也就是我们的gcd。
因此,交换基本上是为了保持因素的正确性。试着在没有交换的情况下做数学题,你很快就会明白为什么它很重要;)
希望这有帮助!
Python3 实例 以下代码用于实现最大公约数算法: 实例(Python 3.0+)# Filename : test.py # author by : www.runoob.com # 定义一个函数 def hcf(x, y): """该函数返回两个数的最大公约数""" # 获取最小值 if x > y: smaller = y else: smaller = x for i in range
我试图让这个程序计算两个用户输入的正整数(x和y)的最大公约数(GCD)。set函数不返回可以索引的列表。关于如何找到GCD有什么建议吗?
计算两个或两个以上数字/数字数组的最大公约数。 内部的 _gcd 函数使用递归。基本情况是,当 y 等于 0 的情况下,返回 x 。否则,返回 y 的最大公约数和x / y的其余数。 const gcd = (...arr) => { const _gcd = (x, y) => (!y ? x : gcd(y, x % y)); return [...arr].reduce((a, b)
本文向大家介绍java求最大公约数与最小公倍数的方法示例,包括了java求最大公约数与最小公倍数的方法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java求最大公约数与最小公倍数的方法。分享给大家供大家参考,具体如下: Gongyueshu.java文件: 此处需要由控制台输入参数,eclipse环境运行的设置步骤为Run》Run Configurations进入运行的调试配置界面
从这个问题Java:获得最大公约数 在获取任何数据类型的gcd时,无论是,,,,哪个答案在精度,速度,cpu使用等方面更好? A: B:
本文向大家介绍PHP编程求最大公约数与最小公倍数的方法示例,包括了PHP编程求最大公约数与最小公倍数的方法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP编程求最大公约数与最小公倍数的方法。分享给大家供大家参考,具体如下: PS:这里再为大家推荐几款在线计算工具供大家参考使用: 在线一元函数(方程)求解计算工具: http://tools.jb51.net/jisuanqi/eq