u16suzuの blog

日々学んだことのメモブログです。

Rubyで等差数列と等比数列を書いてみる

inject便利だ。

# 等差数列
def f(a, d, c)
  c.times.map{|i| a + (d * i)}
end
p f(1, 1, 5)

# 等比数列
def f2(a, r, c)
  c.times.map{|i| (a * r **i)}
end
p f2(1, 3, 5)

# 等比数列 DP ver
def f3(a, r, c)
  c.times.inject([]){|res, _| res << (res.last || a) * r}
end
p f3(1, 3, 5)

# 等差数列 DP ver
def f4(a, d, c)
  c.times.inject([]) do |res, _|
    if res.last
      res << res.last + d
    else
      res << a
    end
  end
end
p f4(1, 1, 5)

# 等差数列 Enumerator::ArithmeticSequence ver
# #stepがEnumeratorを継承したEnumerator::ArithmeticSequence を返す。
# Enumerator::ArithmeticSequenceは等差数列を表現するクラス
p 1.step(by: 3).take(5)