Ruby 如何优化代码——这是可行的,但我知道我';我错过了很多学习

Ruby 如何优化代码——这是可行的,但我知道我';我错过了很多学习,ruby,Ruby,我正在做的练习要求“编写一个方法,copinite?(num_1,num_2),它接受两个数字作为参数。如果两个数字之间的唯一公约数为1,则该方法应返回true。” 我已经写了一个完成任务的方法,首先找到所有的因素,然后对它们进行排序并寻找重复的因素。但我正在寻找一些建议,我应该考虑优化它。 代码是有效的,但它并不干净 def因子(num) 返回(1..num)。选择{n}num%n==0} 结束 定义互质?(num_1,num_2) num_1_factors=因子(num_1) num_2_

我正在做的练习要求“编写一个方法,copinite?(num_1,num_2),它接受两个数字作为参数。如果两个数字之间的唯一公约数为1,则该方法应返回true。”

我已经写了一个完成任务的方法,首先找到所有的因素,然后对它们进行排序并寻找重复的因素。但我正在寻找一些建议,我应该考虑优化它。 代码是有效的,但它并不干净

def因子(num)
返回(1..num)。选择{n}num%n==0}
结束
定义互质?(num_1,num_2)
num_1_factors=因子(num_1)
num_2_factors=因子(num_2)
所有系数=第1个系数+第2个系数
新=所有系数。排序
dups=0
新的。每个索引都有|
如果新[i]==新[i+1],则dups+=1
结束
如果DUP>1
假的
其他的
真的
结束
结束
p互质?(25,12)#=>真
p互质?(7,11)#=>真
p互质?(30,9)#=>假
p互质?(6,24)#=>假

您不需要比较所有因素,只需要比较主要因素。Ruby确实有一个

您可以只使用整数#gcd:

您可以使用查找GCD,然后检查它是否为1

def gcd a、b
而a%b!=0
a、 b=b,a%b
结束
返回b
结束
定义互质?a、 b
gcd(a,b)=1
结束
p互质?(25,12)#=>真
p互质?(7,11)#=>真
p互质?(30,9)#=>假
p互质?(6,24)#=>假```

也许吧?现在我什么都可以用。我刚开始学习ruby,但它们没有任何限制,所以我将对此进行检查。如果我们能想出一个更好的方法来做某事,那么我们就有更多的力量。教练甚至告诉我们堆栈溢出是我们的朋友。我之前没有注意到@panic的答案。因此,我删除了我先前的评论,并将删除这一条。您可能希望删除对我先前评论的回复。谢谢。还没有接触到素数类,所以这给了我一些我没有的信息。
require 'prime'

def prime_numbers(num_1, num_2)
  Prime.each([num_1, num_2].max / 2).map(&:itself)
end

def factors(num, prime_numbers)
  prime_numbers.select {|n| num % n == 0}
end

def coprime?(num_1, num_2)
 prime_numbers = prime_numbers(num_1, num_2)
 # & returns the intersection of 2 arrays (https://stackoverflow.com/a/5678143)
 (factors(num_1, prime_numbers) & factors(num_2, prime_numbers)).length == 0
end
def coprime?(num_1, num_2)
  num_1.gcd(num_2) == 1
end