相互再帰とは

了解!!!

example

上記のウィキピージャの例を用いる。 OCamlで表現するならこんな感じだろうか。

example
let rec a x =
  if x <= 1 then 1
  else
    b (x + 2)
and b x = a (x - 3) + 4

abが相互再帰となっている。

abandキーワードで同時に定義しないといけないんだろうか?

分解

aを定義するなら、bを外から受け取って使い、bもまた逆を考えてみる。

let gen_a b x =
  if x <= 1 then 1
  else
    b (x + 2)
let gen_b a x = a (x - 3) + 4

レッツ結合!

let a' x = gen_a ...?

ちょっとまって、bが無いやん! bが欲しくて分解したのに……。

結合の解法

bを作るにはaが必要、しかしaを作るにはbが必要、なら俺達はどうすればいい?

ああそうか、aの定義にbが必要ならbを作ればいい、baが必要だが、再帰関数の中にaは存在できるから

let rec a' x = gen_a (gen_b a) x
let b' x = gen_b a' x

OK!!!!!!!!!!!!!

ほか

この分解は必ず可能なんですか? ご連絡ください。