递归函数问题

仔细阅读以下一段递归的函数定义:intack(intm,intn){if(m==0){returnn+1;}Elseif(n==0){returnack(m-1,1);}... 仔细阅读以下一段递归的函数定义:
in tack(int m,int n)
{
if(m==0)
{
return
n+1;
}
Else if(n==0)
{
return
ack(m-1,1);
}
else
{
retrun
ack(m-1,ack(m,n-1));
}
}
请问ack(3,3)的返回值是( )。

还有请问高手ack()是什么算法,谢谢!
展开
 我来答
岁月哪曾斑驳
2014-03-21 · TA获得超过742个赞
知道小有建树答主
回答量:278
采纳率:50%
帮助的人:353万
展开全部
解题步骤:

1,ack(1,n)=ack(0,ack(1,n-1))+1=ack(1,n-1)+1;

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

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

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

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) * 2^(n-1);

又ack(3,1)=2ack(3,0)+3

ack(3,0)=a(2,1)=5

所以ack(3,1)=13;

所以 ack(3,n)=2^(n+3) -
3;

所以:ack(3,3)=61;

PS:
这个是著名的Ackerman(阿克曼)函数,典型的非原始递归的递归函数,m<=3的时候像我上面的递推和计算很简单,但是一旦再大就会很麻烦,甚至计算机会彻底无法计算。
可以参考wiki资料了解相关内容:
http://zh.wikipedia.org/zh-cn/%E9%98%BF%E5%85%8B%E6%9B%BC%E5%87%BD%E6%95%B8
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式