アッカーマン関数は、原始再帰ではない、計算可能な合計関数の最も単純な例の1つであることで注目に値します。
A(m,n)
2つの非負整数を取り込む定義を使用します。
A(0,n) = n+1
A(m,0) = A(m-1,1)
A(m,n) = A(m-1,A(m,n-1))
実装できます
- 入力として2つの整数を受け取り、整数を返す名前付き関数または匿名関数、または
- STDINで2つのスペースまたは改行で区切られた整数を取得し、結果をSTDOUTに出力するプログラム。
ライブラリのアッカーマン関数または超指数関数が存在する場合は使用できませんが、他のライブラリのその他の関数は使用できます。正規の累乗が許可されます。
関数は、A(m,n)
m≤3およびn≤10の値を1分以内に検出できる必要があります。少なくとも理論的には、他の入力で終了する必要があります。無限のスタックスペース、ネイティブのBigint型、および任意の長い期間が与えられた場合、答えを返します。編集:言語の制限の深さがデフォルトの再帰の深さである場合は、文字コストなしで再設定できます。
最短の文字数での提出が勝ちです。
答えを確認するための値を次に示します。
A | n=0 1 2 3 4 5 6 7 8 9 10
-----+-----------------------------------------------------------------
m=0 | 1 2 3 4 5 6 7 8 9 10 11
1 | 2 3 4 5 6 7 8 9 10 11 12
2 | 3 5 7 9 11 13 15 17 19 21 23
3 | 5 13 29 61 125 253 509 1021 2045 4093 8189
4 | 13 65533 big really big...
A(3,8)
と同様に素朴に計算できない場合はどうなりますか?非再帰的なソリューションを考え出す必要がありますか、またはこれらの場合に「無限のスタックスペースを想定」することもできますか?確かに、1分以内に終了します。