相互再帰の分解
相互再帰とは
了解!!!
example
上記のウィキピージャの例を用いる。 OCamlで表現するならこんな感じだろうか。
example
let rec a x =
if x <= 1 then 1
else
b (x + 2)
and b x = a (x - 3) + 4
aとbが相互再帰となっている。
aとbはandキーワードで同時に定義しないといけないんだろうか?
分解
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を作ればいい、bはaが必要だが、再帰関数の中にaは存在できるから
let rec a' x = gen_a (gen_b a) x
let b' x = gen_b a' x
OK!!!!!!!!!!!!!
ほか
この分解は必ず可能なんですか? ご連絡ください。

投稿されたコメントはCC BY 4.0ライセンスの下で公開されます。