写出计算Ackermann函数Ack(m,n)的递归函数

写出计算Ackermann函数Ack(m,n)的递归函数,第1张

没有空格和缩进的程序改的我投都晕了呀……以下是帮你改好的程序。至于逻辑上是否正确,你自己根据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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12171077.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存