我尝试编写此代码来计算Ackerman值以及调用函数的次数。但是,计数器始终处于0。你能救我一下吗?
/*
A(m,n) = n+1, if m==0
A(m,n) = A(m-1,1), if m>0 and n==0
A(m,n) = A(m-1,A(m,n-1)), if m>0 and n>0
*/
#include<stdio.h>
static int w=0;
int ackerman(int m,int n)
{
w=w+1;
if(m==0)
return n+1;
else if(m>0 && n==0)
return ackerman(m-1,1);
else if(m>0 && n>0)
return ackerman(m-1,ackerman(m,n-1));
}
int mainackerman()
{
int m,n;
scanf("%d %d",&m,&n);
printf("%d %d",ackerman(m,n),w);
return 0;
}
答案 0 :(得分:5)
您有序列点问题。在您调用ackerman
的同一行中,您正在使用受该调用影响的值。这是未定义的行为。这样做:
int result = ackerman(m,n);
printf("%d %d", result, w);
有good question on StackOverflow有一些与序列点相关的优秀答案。它与C ++有关,但这个想法与C基本相同。