您的位置:首页 > 其它

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

2012-04-09 23:25 375 查看

历史

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

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

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

定义


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

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

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

对于n>2,2 → n → m = A(m+2,n-3) + 3。
使用hyper运算符就是

A(m, n) = hyper(2, m, n + 3) - 3。

函数值表

A(m, n) 的值

m\n01234n
012345
123456
2357911
35132961125
41365533265536 − 3A(3, 265536 − 3)A(3, A(4, 3))
565533A(4, 65533)A(4, A(5, 1))A(4, A(5, 2))A(4, A(5, 3))
6A(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: