-3

//使用递归的阿克曼函数

    #include<stdio.h>
    int ack(int,int);
    int main(void)
    {
        int m,n;
        printf("Enter values for m and n:\t");
        scanf("%d%d",&m,&n);
        printf("The answer is %d\t",ack(m,n));
        return 0;
    }
     int ack(int m,int n);


     {

        if(m==0)
          return n+1;
        else if(m>0&&n==0)
          return ack(m-1,1);
        else if (m>0 && n>0);
          return ack(m-1,ack(m,n-1));
     }

//[错误]- 预期标识符或 '(' 在 '{' 标记之前)

4

3 回答 3

3

您有一个额外的分号需要删除。

的前向声明ack需要分号,但是在定义函数时,参数列表和 : 之间不能有分号{

#include<stdio.h>
int ack(int,int);
int main(void)
{
    int m,n;
    printf("Enter values for m and n:\t");
    scanf("%d%d",&m,&n);
    printf("The answer is %d\t",ack(m,n));
    return 0;
}
 int ack(int m,int n);   /* <------   REMOVE THIS SEMI-COLON */


 {

    if(m==0)
      return n+1;
    else if(m>0&&n==0)
      return ack(m-1,1);
    else if (m>0 && n>0);  /* <--- Also (probably) here */
      return ack(m-1,ack(m,n-1));
 }

我上面评论中提到的第二个分号不是语法错误,删除它会改变语义。实际上,在这种情况下,删除它可能会导致编译器警告缺少返回。但是,该分号对任何阅读代码的人都具有极大的误导性,为了便于阅读,应该将其删除。如果这确实是你想要的语义,你应该把它单独放在一行上,并从它后面的返回中删除一个缩进级别。

于 2020-12-04T16:19:09.773 回答
1

您错误地将分号放在程序中的两个不同位置。

第一个是

 int ack(int m,int n);
                   ^^^^

 {
     //...

第二个是

else if (m>0 && n>0);
                   ^^^^
      return ack(m-1,ack(m,n-1));

据我所知,thr 函数是为无符号(非负)整数定义的。

可以通过以下方式定义

unsigned long long int ackermann( unsigned long long int m, unsigned long long int n )
{
    if (m == 0)
    {
        return n + 1;
    }
    else if (n == 0)
    {
        return ackermann( m - 1, 1 );
    }
    else
    {
        return ackermann( m - 1, ackermann( m, n - 1 ) );
    }
}
于 2020-12-04T16:24:26.150 回答
0

您只需在 else if 语句和函数定义之后删除逗号

#include<stdio.h>

int ack(int,int);

int main(void)
{
    int m,n;
    printf("Enter values for m and n:\t");
    scanf("%d%d",&m,&n);
    printf("The answer is %d\t",ack(m,n));
    return 0;
}
 int ack(int m,int n)
 {

    if(m==0)
      return n+1;
    else if(m>0&&n==0)
      return ack(m-1,1);
    else if (m>0 && n>0)
      return ack(m-1,ack(m,n-1));
 }
于 2020-12-04T16:48:50.903 回答