您的位置:首页 > 其它

Ackerman函数

2015-11-08 21:32 176 查看
维基百科:阿克曼函数

http://zh.wikipedia.org/wiki/%E9%98%BF%E5%85%8B%E6%9B%BC%E5%87%BD%E6%95%B8
阿克曼函数是非原始递归函数的例子;它需要两个自然数作为输入值,输出一个自然数。它的输出值增长速度非常高,仅是(4,3)的输出已大得不能准确计算。

1920年代后期,数学家大卫·希尔伯特的学生Gabriel
Sudan和威廉·阿克曼,当时正研究计算的基础。Sudan发明了一个递归却非原始递归的Sudan函数1928年,阿克曼又独立想出了另一个递归却非原始递归的函数。他最初的念头是一个三个变量的函数A(m,n,p),使用康威链式箭号表示法是m→n→p。阿克曼证明了它是递归函数。希尔伯特在On
the Infinite猜想这个函数不是原始递归。阿克曼在On Hilbert’s Construction of the Real Numbers证明了这点。后来Rozsa
Peter和Raphael
Robinson定义了一个类似的函数,但只用两个变量。

定义:

{ n+1; m=0,n>0

A(m,n) = { A(m-1,1); n=0,m>0

{ A(m-1,A(m,n-1)) n>0,m>0

求 ack(3,3) 的返回值:

[cpp] view
plaincopy

int ack(int m,int n)

{

if(m == 0)

return n+1;

else if(n == 0)

return ack(m-1,1);

else

return ack(m-1,ack(m,n-1));

}

m=0时,

ack(0,0)=1

ack(0,1)=2;

m=1时,

ack(1,0)=2;

ack(1,1)=3;

//容易口算出来的几个值

1,ack(1,n)=ack(0,ack(1,n-1))+1=ack(1,n-1)+1;
//递推式
由递推式得:ack(1,n)=n+2;

ps递推式形如 A(n) = A(n-1) + 1,求A(n)。

用的是高中数学知识,方法是“累加法”(加起来然后消掉),是否想起来了?

2,ack(2,n)=ack(1,ack(2,n-1))=ack(2,n-1)+2;
//递推式
由递推式得:ack(2,n)=2n+3;

ps:A(n) = A(n-1) + 2,方法同 1

3,ack(3,n)=ack(2,ack(3,n-1))=2*ack(3,n-1)+3; //递推式

即:ack(3,n)+3=2(ack(3,n-1)+3)

得: ack(3,n)+3=(ack(3,1)+3)*2n-1;

又ack(3,1)=2ack(3,0)+3

ack(3,0)=a(2,1)=5

所以ack(3,1)=13;
所以 ack(3,n)=2n+3 -
3;

ps递推式形如 A(n) = 2*A(n-1) + 3,求A(n)。

方法是“拆分常数”,拆分常数3后 A(n) +
3 = 2*( A(n-1) + 3 ),

令B(n) = A(n) + 3,即有 B(n) = 2*B(n-1),等比数列啊,B(n)=B(1)*2n-1,

求出B(1),得到B(n),即可得到A(n)。
所以:ack(3,3)=61;

计算机运行该程序时一共调用了ack()函数2432次……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: