2015-08-31 5 views
3

Я пробовал написать этот код для вычисления значения Ackerman, а также количества раз, когда функция вызывается. Тем не менее, счетчик застрял на 0 все время. Не могли бы вы мне помочь?Как вычислить количество рекурсивных вызовов, сделанных для функции Ackerman() в C

/* 
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; 
} 

ответ

4

У вас проблема с порядковым номером. В той же строке, что вы вызываете ackerman, вы используете значение, на которое влияет этот вызов. Это неопределенное поведение. Сделайте это вместо того, чтобы:

int result = ackerman(m,n); 
printf("%d %d", result, w); 

Существует good question on StackOverflow с некоторыми отличными ответами, связанных с последовательностью точек. Это связано с C++, но идея по существу такая же, как и для C.