2026-08-28·作者 Sijie Wang#idea#math

ackermann

阿克曼函数——完全可计算,但不是原始递归

父级:recursive-functions

primitive recursion ⊊ 完全可计算的经典见证:一个你显然能计算、却没有任何 for 循环程序能计算的函数。

阿克曼函数

A(0, n) = n + 1 A(m+1, 0) = A(m, 1) A(m+1, n+1) = A(m, A(m+1, n)) 最后一行在自己的参数内部递归——是嵌套,不是单纯的计数器。

A 是完全的(每次调用都会终止——数对 (m,n) 按字典序严格递减),也显然是可计算的(照规则执行即可)。

Theorem

A 不是原始递归的 阿克曼函数比任何原始递归函数都增长得快。

Proof

支撑证明的是一条支配引理:每一个原始递归函数都被某个单一的阿克曼层级封顶。我们要用到 A 的几条标准单调性(均可用归纳法证明):A(m,n) > n;A 在每个参数上都严格递增;以及层级吸收:A(a, A(b,n)) ≤ A(max(a,b)+2, n)——嵌套两层的代价只是一个常数。

引理。 对任意原始递归函数 f(x₁,…,xₖ),都存在一个固定层级 t,使得对所有输入都有 f(x⃗) < A(t, max(x⃗))。

对 f 的构造做结构归纳来证明。

  • 基础情形。 零函数 = 0、后继函数 = A(0,x)、投影函数 ≤ max(x⃗)——全部都 < A(1, max(x⃗))。
  • 复合。 f = g(h₁,…,hⱼ)。由归纳假设,每个 hᵢ < A(u, max(x⃗))(取最大的 u),且 g < A(s, 其参数的最大值)。于是 f < A(s, A(u, max(x⃗))) ≤ A(max(s,u)+2, max(x⃗)),由层级吸收得到——仍是一个固定层级。
  • 原始递归。 f(0,x⃗)=g(x⃗),f(n+1,x⃗)=h(n,f(n,x⃗),x⃗),由归纳假设 g < A(p,·),h < A(q,·)。展开递归:每一步都套用一次(被 A(q,·) 界定的)操作,共 n 层深。而 A(q,·) 迭代 n 次仍不超过 A(q+1, n+·)——这恰好就是递推式 A(q+1, n+1) = A(q, A(q+1, n))。所以 f < A(q+2, n + max(x⃗))——同样是一个固定层级。

每一种构造方式都只把所需层级抬高一个常数,所以任何固定的原始递归函数 f 都落在某个固定层级 t 之下。∎(引理证毕)

现在对角化。 假设 A 确实是原始递归的。那么 g(n) = A(n,n) + 1 也是原始递归的(把 A 与对角线复合而成),于是引理给出一个固定的 t,使得对所有 n 都有 g(n) < A(t, n)。令 n = t: A(t,t) + 1 = g(t) < A(t, t)——矛盾。所以 A 不是原始递归的。∎

寓意:一个原始递归函数被困在层级体系 A(0,·), A(1,·), A(2,·), … 中某个固定的梯级 t 上;而 A(n,n) 会随 n 一路往上爬梯级,所以它逃出了每一个固定梯级。

增长速度极其剧烈:A(4,2) 就已经有 19,729 位十进制数字。这份额外的威力来自嵌套递归——恰恰是有界计数器无法表达的东西,也预示了 general-recursion 中那种无界搜索。(A 本身依然是完全的;你还不需要不终止性——但你已经离开了 for 循环的世界。)

关于这一条

sijie 的一条 wiki 条目。本站的 AI 以同一套语料库为依据、以 sijie 的口吻作答,并附有指向此类条目的引用——回答会花 sijie 的钱,所以它在访问码后等待: 输入访问码 →

ackermann — Sijie Wang