c语言编译Ackman函数,ACKMAN函数的推导

今年信息学奥赛初赛提高组,阅读程序写结果的第一题如下:

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值