フィボナッチ

id:h_sakuraiさんからフィボナッチも書いてみて下さい(もちろん再帰で)と言われたので書いてみた。
1.1

#フィボナッチ再帰
def fib n
  case n
  when 0 then 0
  when 1 then 1
  else
    fib(n-1)+fib(n-2)
  end
end
puts fib 10 #=>55

これ、でかい引数渡したらスタックやばいよね

むー・・

def fib n
  def f(n,a=1,b=0)
    case n
    when 0 then 0
    when 1 then a
    else
      f(n-1,a+b,a)
    end
  end
  f(n)
end
puts fib 10 #=>55

入れ子にしてみた。

n,a,b
10,1,0
9,1,1
8,2,1
7,3,2
6,5,3
5,8,5
4,13,8
3,21,13
2,34,21
1,55,34 => when 1 then a でaがかえって55
うーむ、再帰って、コードでの処理の流れと、頭の中で考えてる流れの不一致が難しく感じる原因かな?


階乗その2

def fact(n,r=n)
  if n==1
    r
  else
    fact(n-1,r*(n-1))
  end
end
puts fact 3 #=>6
//Scala.貘本より
def factorial(i: Int): Int = {
  def fact(i: Int, accumulator: Int): Int = {
    if (i <= 1)
      accumulator
    else
      fact(i - 1, i * accumulator)
  }

  fact(i, 1)
}