0

我创建了以下内容,这很有效,但看起来很神秘。有没有办法以更 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

红宝石 1.9.3

4

3 回答 3

5

您的方法的结果将始终是从(N/2) + 1到的数字列表N

对于每个i<=(N/2),2*i也将在列表中。

对于列表中的每一个,其中 x 是大于 1 的整数j >= (N/2)+1时不会有 a ,因为.k=x*j2*j > N

因此,如果您的方法仅返回,((self/2 + 1)..self).to_a它也将按您的意愿工作。

于 2012-09-10T02:56:32.853 回答
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_',因为我们可以添加?

于 2012-09-10T02:44:17.503 回答
1

这是我的

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。

于 2012-09-10T09:51:02.720 回答