企鹅2012笔试中的阿克曼函数(做错了,呜呜。。)

历史

1920年代后期,数学家大卫·希尔伯特的学生Gabriel Sudan和威廉·阿克曼,当时正研究计算的基础。Sudan发明了一个递归却非原始递归的Sudan函数1928年,阿克曼又独立想出了另一个递归却非原始递归的函数。[1]

他最初的念头是一个三个变量的函数A(m,n,p),使用康威链式箭号表示法mnp。阿克曼证明了它是递归函数。希尔伯特在On the Infinite猜想这个函数不是原始递归。阿克曼在On Hilbert’s Construction of the Real Numbers证明了这点。

后来Rozsa PeterRaphael Robinson定义了一个类似的函数,但只用两个变量。

定义

 A(m, n) = 
  \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且n>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 最终可以达到零。(较技术性的表达:在每种情况下,有序对(mn)按字典次序递减,它保持了非负整数的良序关系)。但是,在 m 递减的时候, n 的增加没有上界,而且增加的幅度还不少呢。

这个函数亦可用康威链式箭号表示法来作一个非递回性的定义:

对于m>2,A(mn) = (2 → (n+3) → (m - 2)) - 3。

即是

对于n>2,2 → n → m = A(m+2,n-3) + 3。

使用hyper运算符就是

A(mn) = hyper(2, mn + 3) - 3。

函数值表

A(mn) 的值
m\n01234n
0 1 2 3 4 5 n + 1
1 2 3 4 5 6 n + 2
2 3 5 7 9 11 2\cdot(n + 3)-3
3 5 13 29 61 125 2^{(n+3)} - 3
4 13 65533 265536 − 3 A(3, 265536 − 3) A(3, A(4, 3)) \begin{matrix}\underbrace{{2^2}^{{\cdot}^{{\cdot}^{{\cdot}^2}}}} - 3 \\n\mbox{ + 3 twos}\end{matrix}
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))

 

来自维基百科http://zh.wikipedia.org/wiki/%E9%98%BF%E5%85%8B%E6%9B%BC%E5%87%BD%E6%95%B8

posted on 2012-04-09 23:25  bingwenst  阅读(544)  评论(0编辑  收藏  举报

导航