在數學中,兩個或更多個整數的最大公約數(gcd),當它們中的至少一個不爲零時,是將數除以餘數的最大正整數。例如,8和12的最大公約數是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
的最大數字。
但爲什麼再次調用相同的方法,但切換參數並再次取模數?
我並不喜歡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)'功能。 – akuhn
我認爲如果你剛剛嘗試過,比如說55和105,這個方法會更清晰。 –