![見出し画像](https://assets.st-note.com/production/uploads/images/90470542/rectangle_large_type_2_964004321bc0fa83995f6db90559e272.png?width=1200)
Ologで再起関数の例:フィボナッチ数
下記のExample 6.6.1のOlogが面白かったので、フィボナッチ数を求める再帰関数でもやってみた。
フィボナッチ数のOlog
次のように描いた(直和の記号$${\amalg}$$が面倒だったので、+で代替している)。
![](https://assets.st-note.com/img/1667548115875-Wef0hvk38C.png?width=1200)
二つ組
射影 $${p, q}$$の性質から、 $${s}$$がどのような二つ組を作るかわかる。
$${s(n) = (f(d_1(n)), f(d_2(n)))}$$
したがって、$${f(i_2(n)) = a(s(n)) = a(f(d_1(n)), f(d_2(n)))}$$になる。
![](https://assets.st-note.com/img/1667548561092-B0hGeLupcB.png?width=1200)
![](https://assets.st-note.com/img/1667548616957-wMuCOkGOxx.png?width=1200)
場合分け
恒等写像の性質から$${\text{id}(0) = 0, \text{id}(1) = 1}$$となる。これと、直和に伴う包含写像 $${i_0, i_1, i_2}$$の性質から、$${f}$$は次のように場合分けで書ける。
$$
f(n) = \left\{ \begin{array}{ll}
0 & \text{if} n = 0\\
1 & \text{if} n = 1 \\
a(f(d_1(n)), f(d_2(n))) & \text{if} n \gt 1
\end{array} \right.
$$
![](https://assets.st-note.com/img/1667549088374-qgsugAIoDm.png?width=1200)
![](https://assets.st-note.com/img/1667806522290-1YPfq60CEl.png?width=1200)
![](https://assets.st-note.com/img/1667549133544-kSem0yvcOS.png?width=1200)
残りの関数の選定
$${a, d_1, d_2}$$を次のような関数とすれば、$${f(i_2(n)) = f(n - 1) + f(n - 2)}$$となる。
$${a(x, y) = x + y}$$:和
$${d_1(n) = n - 1}$$:前者関数
$${d_2(n) = n - 2}$$:前々者関数
すると、$${f}$$は次のように書けて、確かにフィボナッチ数の再帰関数になる。
$$
f(n) = \left\{ \begin{array}{ll}
0 & \text{if} n = 0\\
1 & \text{if} n = 1 \\
f(n - 1) + f(n - 2) & \text{if} n \gt 1
\end{array} \right.
$$