2015-08-31 75 views
3

我試着編寫此代碼來計算Ackerman值以及該函數被調用的次數。但是,計數器始終處於0。你能幫我嗎?如何計算對C中的Ackerman()函數進行的遞歸調用數

/* 
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相同。