第34回 Ruby/Rails 勉強会 - 演習 2

演習問題 のつづき

フィボナッチ数を計算するプログラムをループ版と再帰版の両方を書いてください。

再帰

def fibonacci(n)
  case n
  when 0
    0
  when 1..2
    1
  else
    fibonacci(n-2)+fibonacci(n-1)
  end
end

(0..8).each do |i|
  fibonacci i         # => 0, 1, 1, 2, 3, 5, 8, 13, 21
end

ループ版

def fibonacci(n)
  f0, f1 = 0, 1
  for i in 1..n
    f0, f1 = f1, f0 + f1
  end
  f0
end

(0..8).each do |i|
  fibonacci i         # => 0, 1, 1, 2, 3, 5, 8, 13, 21
end

また無理矢理 for を使ってみた。

また、以下の数列の漸化式を求めフィボナッチ数と同じように各項の値を計算するプログラムをループ版と再帰版の両方とも書いてください。

例) 1 1 1 3 5 9 17 31 57 ...

漸化式は、こう?
{$G_{0} = 0$}
{$G_{1} = 1$}
{$G_{2} = 1$}
{$G_{3} = 1$}
{$G_{n} = G_{n-3} + G_{n-2} + G_{n-1}$}

再帰

def gunction(n)
  case n
  when 0
    0
  when 1..3
    1
  else
    gunction(n-3) + gunction(n-2) + gunction(n-1)
  end
end

(0..9).each do |i|
  gunction i        # => 0, 1, 1, 1, 3, 5, 9, 17, 31, 57
end

ループ版

def gunction(n)
  g0, g1, g2, g3 = 0, 1, 1, 1
  for i in 1..n
    g0, g1, g2, g3 = g1, g2, g3, g1+g2+g3
  end
  g0
end

(0..9).each do |i|
  gunction i        # => 0, 1, 1, 1, 3, 5, 9, 17, 31, 57
end

また無理矢理 (ry