相互再帰の分解
相互再帰とは
了解!!!
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!!!!!!!!!!!!!
ほか
この分解は必ず可能なんですか? ご連絡ください。