【发布时间】:2016-12-29 02:25:23
【问题描述】:
在数学中,两个或多个整数的最大公约数 (gcd),当其中至少一个不为零时,是除以无余数的最大正整数。比如8和12的GCD是4。Wikipedia
以下方法可以确定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 的最大数字是有道理的。
但为什么要再次调用相同的方法,但要切换 args 并再次取模?
我并没有探究 else 部分背后的原因。
编辑:
添加一些puts 语句以使其更清晰:
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)
标准输出:
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
【问题讨论】:
-
也许只需添加一些
puts语句来查看它的作用?有趣的是,Ruby 内置了12.gcd(4)函数。 -
我认为如果您只是在 55 和 105 上尝试一下,该方法会更清晰。