我创建了以下内容,但是看起来很神秘。有没有办法以更加Ruby风格或可理解的方式编写它?
此方法删除数字下方的较低因子。因此,10.high_factors
会返回[6,7,8,9,10]
。 6可被2整除,因此2被删除。列表中没有大于6的倍数,因此保持不变。
class Fixnum
def high_factors
# Get the numbers that are not divisible by lower ones below self
list = (2..self).to_a
2.upto(self).each do |i|
((i+1)..self).each { |j| list.delete i if j.is_divisible_by? i }
end
list
end
def is_divisible_by? divisor
self % divisor == 0
end
end
Ruby 1.9.3
答案 0 :(得分:5)
您的方法的结果将始终是从(N/2) + 1
到N
的数字列表。
对于每个i<=(N/2)
,2*i
也会出现在列表中。
对于列表中的每个j >= (N/2)+1
,其上不会有k=x*j
,其中x是大于1的整数,因为2*j > N
。
因此,如果您的方法只返回((self/2 + 1)..self).to_a
,它也可以按您的意愿工作。
答案 1 :(得分:2)
这个怎么样?只需删除可被上面的数字整除的数字。
class Fixnum
def high_factors
# Get the numbers that are not divisible by lower ones below self
(2..self).reject do |i|
(i+1..self).any? { |j| j.divisible_by?(i) }
end
end
def divisible_by?(divisor)
self % divisor == 0
end
end
ps:在ruby中,通常在布尔函数的开头省略'is_',因为我们可以添加?
答案 2 :(得分:1)
Heres mine
def high_factors
ary = (2..self).to_a
ary.reject do |factor|
ary.index {|num| num != factor and num % factor == 0}
end
end
它的工作原因如果找不到合适的匹配,则Array #index返回nil。