たらいまわし関数 竹内関数

逆に、隣接行列だけ見ても さっぱり 終わるのか無限ループになるのかわからない例

説明は 竹内関数 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」を検索すると、答と その証明が書かれています。読んでもさっぱりわかりませんが。

 が、ここで、最初の疑問に対して 関数の隣接行列を書いただけでは、そのプログラム全体が停止するかどうかを調べるのは難しい (場合もある) という答えが出たように思えます。 ちゃんちゃん。