Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何计算C中对Ackerman()函数的递归调用数_C_Recursion_Global_Counter_Ackermann - Fatal编程技术网

如何计算C中对Ackerman()函数的递归调用数

如何计算C中对Ackerman()函数的递归调用数,c,recursion,global,counter,ackermann,C,Recursion,Global,Counter,Ackermann,我试图编写这段代码来计算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

我试图编写这段代码来计算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;
}
/*
A(m,n)=n+1,如果m==0
A(m,n)=A(m-1,1),如果m>0且n==0
A(m,n)=A(m-1,A(m,n-1)),如果m>0且n>0
*/
#包括
静态int w=0;
内特阿克曼(内特m,内特n)
{
w=w+1;
如果(m==0)
返回n+1;
else如果(m>0&&n==0)
返回阿克曼(m-1,1);
else如果(m>0&&n>0)
返回阿克曼(m-1,阿克曼(m,n-1));
}
int mainackerman()
{
int m,n;
scanf(“%d%d”,&m,&n);
printf(“%d%d”,阿克曼(m,n),w);
返回0;
}

您有序列点问题。在调用
ackerman
的同一行上,您正在使用受该调用影响的值。这是未定义的行为。改为这样做:

int result = ackerman(m,n);
printf("%d %d", result, w);
有一个与序列点相关的非常好的答案。它与C++相关,但其思想与C.</P>基本相同。