已知Ackermann函数定义如下:
[ n+1 if m=0
akm(m,n)=-[ ack(m-1,1) if m<>0 n=0
[ akm(m-1,akm(m,n-1)) if m<>0 n<>0
写出计算Ack(m,n)的非递归算法。
【北京航空航天大学 1999 六 (15分)】,【同济大学1999 】
法一:
int Ackerman(int m.int n)
{
in akm[m][n];
int i,j;
memset(akm,o,sizeof(akm));
for(j=0;j<n;j++)
akm[0][j]=j+1;
for(i=1;i<m;i++)
{
akm[i][0]=akm[i-1][1];
for(j=1;j<n;j++)
{
akm[i][j]=akm[i-1][akm[i][j-1]];
}
}
return akm[m][n];
}
法二:
stack s;
int ack(int m,int n)
{
int top=0;
s[top].mval=m;
s[top].nval=n;
do
{
while(s[top].mval)
{
while(s[top].nval)
{
top++;
s[top].mval= s[top-1].mval;
s[top].nval= s[top-1].nval-1;
}
s[top].mval--;
s[top].nval=1;
}
if(top>0)
{
top--;
s[top].mval--;
s[top].nval= s[top+1].nval++;
}
}while(top!=0|| s[top].mval!=0);
ack= s[top].nval+1;
top--;
}
发表于 @ 2006年11月29日 09:03:00|评论(loading...)|编辑