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

Ruby 1.9.3

4

3 に答える 3

5

(N/2) + 1メソッドの結果は、常にからまでの数値のリストになりますN

ごとi<=(N/2)に、2*iもリストに含まれます。

リストのすべてについて、 xが1より大きい整数であるaはありj >= (N/2)+1ません。これは、 。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 に答える