末尾再帰とは

再帰関数で、return時に再帰呼出しをする方法。
コールスタックを節約できるので、スタックオーバーフローを回避できる。
OCamlではコンパイラにより、ループの形に最適化される。

# 末尾再帰未対応
def func(x)
  if x <= 1
    return 1
  else
    return x + func(x - 1)
  end
end

# 末尾再帰対応
def func_m(x, a = 1)
  if x <= 1
    return a
  else
    return func_m(x - 1, x + a)
  end
end