フィボナッチ数列は相互再帰だという話
この記事では,Haskellの記法を使います。
自然数は以下のように定義しておきます。
data Nat = Zero | Succ Nat
フィボナッチ数列を計算する関数 典型的な定義
fib Zero = Zero fib (Succ Zero) = Succ Zero fib (Succ (Succ n)) = fib n + fib (Succ n)
2段階目の場合分け部分を関数としてくくり出す
fib (S n'')の引数(S n'')は必ず1以上になるので,1段階目で無駄な場合分けが発生します。
1段階目の場合分けをパスして,2段階目の場合分けにジャンプするために,2段階目の場合分け部分を関数としてくくり出します。
fib Zero = Zero fib (Succ n) = fibS n fibS Zero = Succ Z fibS (Succ n) = fib n + fibS n
2段階目の場合分け部分を,fibSという関数にしました。
fibとfibSは相互再帰関数です。
fibとfibSの関数呼び出し関係を図にすると,こんな感じです。