Rubyで素数判定してみた
ちょっとした練習に素数判定を書いてみようかと思ったらPrimeクラスの存在を知って絶望した。
それじゃ練習にならないから自前で書いてみた。
class PrimePredicater def initialize @cache = [2] end def prime?(x) extend_cache x if @cache.empty? || x > @cache.last @cache.include? x end private def _prime?(x) @cache.each do |i| return false if x % i == 0 end true end def extend_cache(x) (@cache.last + 1 .. x).each do |i| @cache.push i if _prime? x end end end prime = PrimePredicater.new 1.upto(100) do |i| puts "#{i} is prime? : #{prime.prime? i}" end
気になるところ
まあ動くんだけど、なんだか「メソッドの返り値は、メソッド内で最後に評価された式の値になる」(returnを明示する必要がない)っていうのに慣れない。
#これを return false if x % i == 0 #こうしても break if x % i == 0 #戻り値はx % i == 0の値にならない
if式やbreak, イテレータあたりが返す値についてもうちょっと知識つける必要があるなあ。
せっかくx % i == 0 を評価してtrue/falseを返してるんだから、それをそのままメソッドの返り値に突っ込んだほうが書き方としてスマートっぽい(気がする)
x % i == 0 ならイテレータから抜けて、最後に評価された !(x % i == 0)の値を返すような、そんなスマートなやりかたを探そう...