Ackerman函数

原创 2012年04月08日 20:39:26

维基百科:阿克曼函数

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),使用康威链式箭号表示法mnp。阿克曼证明了它是递归函数。希尔伯特在On the Infinite猜想这个函数不是原始递归。阿克曼在On Hilbert’s Construction of the Real Numbers证明了这点。后来Rozsa PeterRaphael 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) 的返回值:

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));
}

0,ack(0,1)=2;

  ack(1,0)=ack(0,1)=2;

  ack(1,1)=ack(0,ack(1,0))=ack(1,0)+1=3;

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

1,ack(1,n)=ack(0,ack(1,n-1))+1=ack(1,n-1)+1;  //递推式

  由递推式得:ack(1,n)=n+1;

  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;

  psA(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次……

ackerman函数的非递归实现(递归函数非递归化)

ackerman函数
  • PKU_ZZY
  • PKU_ZZY
  • 2016年07月17日 19:34
  • 4044

算法分析之Ackerman函数的递归实现算法

Ackerman函数的递归实现算法。 输入:输入两个数字,先输入n,后输入m。 输出:Ackerman函数计算后的值。 示例:输入:4    2,输出:16 package suanfafen...
  • zzc1510334836
  • zzc1510334836
  • 2016年07月21日 10:27
  • 1385

求Ackerman函数的值

原题:已知Akerman函数的定义如下:                       {    n+1                 m=0 Akm(m,n)=  { akm(m-1,1)     ...
  • huanfengyun
  • huanfengyun
  • 2013年06月01日 21:03
  • 1936

Ackerman函数的非递归实现.

在网上看到了一些人在找这个Ackerman函数 ,不知道这个函数的实际含义,首先看到了他的递归形式:注释部分是分析后的结果.int rackerman(int m,int n){  if(m==0) ...
  • swankie
  • swankie
  • 2007年10月24日 11:10
  • 10121

阿克曼函数

维基百科:阿克曼函数 http://zh.wikipedia.org/wiki/%E9%98%BF%E5%85%8B%E6%9B%BC%E5%87%BD%E6%95%B8 阿克曼函数是非原...
  • u012730840
  • u012730840
  • 2014年09月25日 11:51
  • 1419

ackerman函数

递归到非递归的转换   一. 为什么要转换   考虑函数的递归,因为第N次与第N+1次调用所采用的栈不能重用,可能会导致多次调用后,进程分配的栈空间耗尽.   解决的方法之一就是用自己可控制的...
  • Stephan14
  • Stephan14
  • 2014年10月14日 00:01
  • 1505

ackerman函数的非递归实现(递归函数非递归化)

ackerman函数
  • PKU_ZZY
  • PKU_ZZY
  • 2016年07月17日 19:34
  • 4044

ackerman函数的循环实现

在网上看到了一些人在找这个Ackerman函数 , 不知道这个函数的实际含义,首先看到了他的递归形式: 注释部分是分析后的结果. int rackerman(int m,int n) {  ...
  • haoyuedangkong_fei
  • haoyuedangkong_fei
  • 2016年05月12日 20:08
  • 278

每天刷个算法题20160524:阿克曼函数的递归转非递归解法

为了防止思维僵化,每天刷个算法题。这里是阿克曼函数的递归转非递归解法。...
  • u012077163
  • u012077163
  • 2016年05月28日 14:24
  • 3618

SICP 习题 (1.10)解题总结:阿克曼函数

SICP 习题 1.10 讲的是一个叫“Akermann函数”的东西,去百度查可以查到对应的中文翻译,叫“阿克曼函数”。就像前面的解题总结中提到的,我是一个数学恐惧者,看着稍微复杂一点的什么函数我就怕...
  • keyboardOTA
  • keyboardOTA
  • 2013年09月09日 22:55
  • 2761
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Ackerman函数
举报原因:
原因补充:

(最多只允许输入30个字)