阿克曼函數是非原始递归函数的例子;它需要兩個自然數作為輸入值,輸出一個自然數。它的輸出值增長速度非常高,僅是(4,3)的輸出已大得不能準確計算。
他最初的念頭是一個三個變數的函數A(m,n,p),使用康威鏈式箭號表示法是m→n→p。阿克曼證明了它是遞歸函數。希爾伯特在On the Infinite猜想這個函數不是原始遞歸。阿克曼在On Hilbert’s Construction of the Real Numbers證明了這點。
後來Rozsa Peter和Raphael Robinson定義了一個類似的函數,但只用兩個變數。
| \begin{cases} n+1 \\ A(m-1, 1) \\ A(m-1, A(m, n-1)) \\ \end{cases} | 若m=0 |
| 若m>0且n=0 |
| 若m>0且m>0 |
以下是阿克曼函數的偽代碼:
function ack(m, n) while m ≠ 0 if n = 0 n := 1 else n := ack(m, n-1) m := m - 1 return n+1
Haskell 语言能生成更精确的定义:
ack 0 n = n + 1 ack m 0 = ack (m - 1) 1 ack m n = ack (m - 1) (ack m (n - 1))
递归是有界的,因为在每次应用递归時,要么 m 递减,要么 m 保持不变而 n 递减。每次 n 达到零,m 递减,所以 m 最终可以达到零。(較技術性的表达:在每种情况下,有序对(m, n)按字典次序递减,它保持了非负整数的良序关系)。但是,在 m 递减的时候, n 的增加没有上界,而且增加的幅度還不少呢。
這個函數亦可用康威鏈式箭號表示法來作一個非遞迴性的定義:
使用hyper運算符就是
| m\n | 0 | 1 | 2 | 3 | 4 | n |
|---|---|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 | 5 | |
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 2 | 3 | 5 | 7 | 9 | 11 | |
| 3 | 5 | 13 | 29 | 61 | 125 | |
| 4 | 13 | 65533 | 265536 − 3 | A(3, 265536 − 3) | A(3, A(4, 3)) | |
| 5 | 65533 | A(4, 65533) | A(4, A(5, 1)) | A(4, A(5, 2)) | A(4, A(5, 3)) | |
| 6 | A(5, 1) | A(5, A(5, 1)) | A(5, A(6, 1)) | A(5, A(6, 2)) | A(5, A(6, 3)) |
Ackermannova funkce | Ackermannfunktion | Ackermann function | Función de Ackermann | Fonction d'Ackermann | Ackermann-függvény | アッカーマン関数 | Ackermannfunctie | Funkcja Ackermanna | Ackermann işlevi | Hàm số Ackermann