大榕树——让我们共成长!
大榕树 myDrs.org
您的位置:大榕树 \ 编程       |  Logo语言   |  Pascal语言   |  信息学奥赛   |  高考保送    |  HTML版本
|  Pascal语言>>算法与技巧>>ACKMAN函数的推导         本站全文搜索: 友情提示:

ACKMAN函数的推导
http://www.mydrs.org  11/27/2001  大榕树


今年信息学奥赛初赛提高组,阅读程序写结果的第一题如下:
PROGRAM GAO7_1;
FUNCTION ACK(M,N:INTEGER):INTEGER;
BEGIN
IF M=0 THEN ACK:=N+1
ELSE IF N=0 THEN ACK:=ACK(M-1,1)
ELSE ACK:=ACK(M-1,ACK(M,N-1))
END;
BEGIN WRITELN(ACK(3,4));READLN;END.
分析这个程序我们可以用下面的函数表示:

学生在解题时,一般都是用递归的方法去实现的,而递归方法将会计算五千多步,在竞赛时这种方法是不可用的,而递归往往可以用递推去实现,因此,我们在教学过程中就讲解了该函数的递推过程,现将推导过程表示如下:
(1) 我们在递归过程中发现该函数总是要调用到M=0,M=1及M=2的情况,因此,我们就考虑要推导ACK(3,N)必须首先推导ACK(0,N),ACK(1,N)以及 ACK(2,N)的情况。
(2) ACK(0,N)可以由函数直接得到,公式为ACK(0,N)=N+1
(3) ACK(1,0)=ACK(0,1)=1+1=0+2
ACK(1,1)=ACK(0,ACK(1,0))=ACK(0,1+1)=1+1+1=1+2
ACK(1,2)=ACK(0,ACK(1,1))=ACK(0,1+2)=1+1+2=2+2
…………………
因此,我们可以联想到ACK(1,N)=N+2。
这个公式可以用数学归纳法证明之。(略)
根据上面的方法,我们可以方便地推导出下面一些公式:
(4) ACK(2,0)=ACK(1,1)=1+2=3(利用M=1的公式)
ACK(2,1)=ACK(1,ACK(2,0))=ACK(1,1+2)=3+2=5
(利用M=1的公式及ACK(2,0))
ACK(2,2)=ACK(1,ACK(2,1))=ACK(1,5)=5+2=(2+1)*2+1
…………………
因此,我们可以联想到ACK(2,N)=(N+1)*2+1。
同样,这个公式可以用数学归纳法证明之。(略)
(5) ACK(3,0)=ACK(2,1)=(1+1)*2+1=5(利用M=2的公式)
ACK(3,1)=ACK(2,ACK(3,0))=ACK(2,5)=((1+1)*2+1+1)*2+1=2^3+2^2+1
ACK(3,2)=ACK(2,ACK(3,1))=ACK(2,13)=(2^3+2^2+1+1)*2+1=2^4+2^3+2^2+1
=2^5-3
…………………
因此,我们可以联想到ACK(3,N)=2^(N+3)-3。


作 者:倪诗律
来 源:江苏省海门中学电教组
共有3554位读者阅读过此文

  • 上篇文章SGOI第六次竞赛试题
  • 下篇文章SGOI6成绩揭晓

  • 发送邮件
    保存页面 打印文章 HTML版本 发表评论

    □- 近期热门文章 □- 相关文章
    1. NOIP2006竞赛大纲 [8306]
    2. 七类高中生具有保送资格 [5910]
    3. NOI2006获奖选手名单 [4955]
    4. 关于举办NOIP2006模拟赛的通告 [4106]
    5. Turbo Pascal各语句运行速... [3594]
    6. Turbo王者归来新Delphi免费... [3181]
    7. IOI2006我国4名选手全部获得金... [2945]
    8. 关于APIO2007与IOI2007... [2763]
    9. noip倒计时 by 枯叶蝴蝶 [2683]
    10. 朱泽园:思想上的金牌更重要 [2168]
    第八届分区联赛复测消息
    第六届分区联赛提高组初赛答案
    第六届分区联赛提高组初赛
    第七届分区联赛提高组复赛
    分区联赛指南
    第七届分区提高组初赛答案
    第七届分区联赛提高组初赛
    第七届分区普及组初赛答案
    第七届分区联赛普及组初赛
    全国分区联赛复赛评奖消息
     

    关于本站 | 合作伙伴 | 联系方式
    大榕树 版权所有 ©1999-2006 www.myDrs.org 闽ICP备05000721号