企鹅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 Peter和Raphael 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。
函数值表
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)) |
相关文章推荐
- 企鹅2012实习生笔试
- 2012 我的腾讯暑假实习笔试面试经历-机会要靠自己争取,机会是给有准备的人
- 【2012】笔试面试总结(一)
- 中兴笔试归来总结(2012软件类)
- 笔试题:一个整数的“真数”,是将它的各个位相加得到的和。写一个函数完成一个数组按真数大小排序
- [转]SQL Server 2012 的 T-SQL 新功能 – 新的数据分析函数(LEAD、LAG)
- 华为2012春上机笔试题+参考程序
- 笔试面试那件小事(C++函数高级特征)
- C语言字符串库函数的实现也是笔试题常考的题目,以下代码没有严格测试,只是简单的实现:
- 程序员笔试题----2012QQ实习生笔试题
- 国内著名IT公司(百度、搜狗、网易、新浪)2012校园招聘笔试、面试小结
- 搜狗2012笔试
- 字符串操作函数的实现【笔试面试经常考的,这里都有了】
- 商汤2017笔试编程题——绘制函数图像
- 2012中兴软件笔试 回忆录
- 那些年我做错的笔试题一
- 百度2012校园招聘机器学习/数据挖掘工程师(北京)笔试题目
- 美团2012研发工程师笔试题(数数字问题)
- 笔试题 1.3 百度 2012 10.09 简答题 + 程设 --A
- 2012搜狗校园招聘笔试题