auの日記

プログラミング初心者の日記。(auはハンドルネームです)

末尾再帰とは

auです。

プログラミングにおける最適化の一つとして、「末尾再帰」というものがあります。

どんな最適化なのか調べてみました。

末尾再帰とは

末尾再帰(Tail Call)とは、返り値が再帰関数の引数になるような再帰を指します。

普通の再帰だと、スタックのように計算が溜まっていくが、末尾再帰だと計算結果をそのまま引数にするので、スタックオーバーフローが起きません。

再帰
let rec pow a n = 
    if n <= 0 then 1 else a * pow a (n - 1);;
末尾再帰
let pow a n =
  let rec pow_iter result n = 
    if n <= 0 then result
    else
      let result' = result * a in
      pow_iter result' (n - 1)
  in pow_iter 1 n;;