扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
这个代码是没有问题的,可以实现阿克曼函数的功能,我是用c语言试的,修改了一下输入输出函数,给m,n赋了初值,结果是对的。可以实现你想要的功能。
成都创新互联于2013年创立,先为芷江等服务建站,芷江等地企业,进行企业商务咨询服务。为芷江企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
楼主如果要加300分,可能要开2贴了,因为1贴最多只能200分,追加最多只能50分。
你给的那个解法,写的本来就有问题。
不信,你自己试试这个程序:
#includestdio.h
//非递归解法
int akm_nonrecursive(int m, int n)
{
int m1[50], n1[50], cp;
cp = 0;
m1[0] = m;
n1[0] = n;
do {
while (m1[cp] 0) { /* 压栈, 直到m1[cp] = 0 */
while (n1[cp] 0) { /* 压栈, 直到n1[cp] = 0 */
cp++;
m1[cp] = m1[cp - 1];
n1[cp] = n1[cp - 1] - 1;
}
/* 计算akm(m - 1, 1),当n = 0时 */
m1[cp] = m1[cp] - 1;
n1[cp] = 1;
}
/* 改栈顶为akm(m - 1, n + 1),当m = 0时 */
cp--;
m1[cp] = m1[cp] - 1;
n1[cp] = n1[cp + 1] + 1;
} while (cp 0 || m1[cp] 0);
return n1[0] + 1;
}
int main()
{
printf("%d\n",akm_nonrecursive(0,2));
printf("%d\n",akm_nonrecursive(2,0));
printf("%d\n",akm_nonrecursive(2,3));
return 0;
}
The value of Ackerman function is,这句话的意思是“阿克曼函数的值是”
Ackermann函数定义如下:
若m=0,返回n+1。
若m0且n=0,返回Ackermann(m-1,1)。
若m0且n0,返回Ackermann(m-1,Ackermann(m,n-1))。
#includestdio.h
int ack(int m,int n)
{if(m==0)return n+1;
if(m0n==0)return ack(m-1,1);
return ack(m-1,ack(m,n-1));
}
int main()
{ int m,n;
scanf("%d%d",m,n);
printf("A(%d,%d)=%d\n",m,n,ack(m,n));
return 0;
}
你的n、x、y都是int型的,其值要小于65536,但是但输入数字nxy分别为4,2,4时就达到65536,所以程序本身并没有问题,有问题的是数值类型的取值范围太小。而且这个函数计算值过于巨大,如果输入nxy过大一般计算机根本没办法计算。。。
这里给出C语言的阿克曼递归函数:首先,阿克曼函数标准定义:#include stdio.h
#include stdlib.hint Ackmann(int n,int m)
{
if(m==0)return n+1;
else if(m0 n==0)return Ackmann(m-1,1);
else return Ackmann(m-1,Ackmann(m,n-1));
}int main()
{
int m,n;
printf("输入m和n:");
scanf("%d,%d",m,n);
printf("结果是:%d",Ackmann(n,m));
system("pause");
return 0;
}
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流