没有空格和缩进的程序改的我投都晕了呀……以下是帮你改好的程序。至于逻辑上是否正确,你自己根据Ackermann函数Ack(m,n)检验下就可以了。语法上都可以了,我这边运行可以通过,M,N稍微小一点,否则计算太大要出问题。 #include<stdioh>long int ack(int m,int n)
{long int value;if((m<0||n<0)){printf("The condiction of caculating is not exist, EXIT!\n");exit(1);}if(m==0){value=n+1;printf("ack(0,%d)=%d\n",n,n+1);}else if(n==0){value=ack(m-1,1);printf("ack(%d,1)=%d\n",m-1,ack(m-1,1));}else{printf("ack(%d,%d)=ack(%d,ack(%d,%d))\n",m,n,m-1,m,n-1);value=ack((m-1),ack(m,n-1));}return(value);}long int ack(int m,int n);main(){int mm,nn;long int a;printf("Please enter m,n:");scanf("%d%d",&mm,&nn);a=ack(mm,nn);printf("ack(%d,%d)=%ld\n",mm,nn,a);getchar();}
两个问题:
1、Integer太小了,数据早就爆了;
2、栈的调用过头了,“exitcode = 201”的意思就是栈溢出。
事实上,阿克曼函数的值是极大的。
Ackermann(0,n)=n+1
Ackermann(1,n)=n+2
Ackermann(2,n)=2n+3
Ackermann(3,n)=2^(n+3)-3
Ackermann(4,n)=2^2^2^……^2-3,乘幂中共有n+3个2。
当m≥4,Ackermann函数的增长快得惊人。Ackermann(4,0)=13,Ackermann(4,1)=65533,Ackermann(4,2)=2^65536-3有19729位,而Ackermann(4,3)则即使是位数也不易估计。Ackermann(5,0)=65533,Ackermann(5,1)=Ackermann(4,65533)……
针对于小数据,你的程序没问题。
这是一个简单的递归
#include <iostreamh>
int ackermann(int m, int n);
int main()
{
int m,n,result;
cout<<"Input:"<<endl;
cin>>m;
cin>>n;
result = ackermann(m,n);
cout<<result<<endl;
return 0;
}
int ackermann(int m, int n)
{
if (m == 0) return n+1;
if (n == 0) return ackermann(m-1, 1);
return ackermann(m-1, ackermann(m, n-1));
}
如果想提高效率,参见http://baikebaiducom/view/2463172htmfr=ala0_1
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)