为什么 阿克曼函数不是原始递归函数

如题所述

    阿克曼函数是非原始递归函数的例子

    它需要两个自然数作为输入值,输出一个自然数。它的输出值增长速度非常高,仅是(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);  
        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;
      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次……

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-04-19
我不安替东神,不安替司机,不安替少时,不安替闪闪,不安替行星,我只安替函数!!真正的家族癌!
第2个回答  2014-04-19
是不是有预谋啊?最近这类人太多了吧
第3个回答  2014-04-19
这里是函数不行吧。你可以去肥叉组合吧,那里很多号称数学家的人那
第4个回答  2014-04-19
手动爆吧不好玩好嘛

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网