たらいまわし関数 竹内関数
逆に、隣接行列だけ見ても さっぱり 終わるのか無限ループになるのかわからない例
説明は 竹内関数 wikipedia参照
これも隣接行列を書いてみます。
関数一個だけなので 逆にわかりにくい気もしますが。
Tak(X,Y,Z) :- X<=Y, return Z.
Tak(X,Y,Z) :- return Tak(Tak(X-1,Y,Z),Tak(Y-1,Z,X),Tak(Z-1,X,Y).
関数 | 条件 | Tak | |
Tak | X<=Y | 終 | |
Tak | それ以外 | 再帰呼び出し4回 (入れ子1) |
と、これだけ見ても終わるのか終わらないのかわかりませんが、wikipediaの説明にある、ドナルド・クヌース「Textbook Examples of Recursion」を検索すると、答と その証明が書かれています。読んでもさっぱりわかりませんが。
が、ここで、最初の疑問に対して 関数の隣接行列を書いただけでは、そのプログラム全体が停止するかどうかを調べるのは難しい (場合もある) という答えが出たように思えます。 ちゃんちゃん。