2013-11-26 100 views
0

我無法在遞歸調用中返回所需的值。我希望它總是返回0,除非滿足某些條件,那麼它應該返回1並退出。遞歸返回(c/C++)

int check = recursion(a, b, c, d, e, f); 
int recursion(int *a, int *b, int c, int d, int e, int f){ 
    int k, dX, dY; 
    for(k=0;k<=b[1]-1;k++){ 
     dX = b[k*4+3] - e; 
     dY = b[k*4+2] - f; 
     if(((dX == 1 || dX == -1) && (dY == 0))){ 
      if(b[k*4+4] == 1) return 1; 
      e = b[k*4+3]; 
      f = b[k*4+2]; 
      b[k*4+2] = b[k*4+3] = 0; 
      recursion(a, b, c, d, e, f); 
     } 
     if(((dY == 1 || dY == -1) && (dX == 0))){ 
      if(b[k*4+4] == 1) return 1; 
      e = b[k*4+3]; 
      f = b[k*4+2]; 
      b[k*4+2] = b[k*4+3] = 0; 
      recursion(a, b, c, d, e, f);  
     } 
    } 
    return 0; 
} 

許多不相關的信息已被刪除,但你可以看到,如果B [K * 4 + 4] == 1在anypoint,檢查應則等於1,否則返回0並檢查將= 0.它完成了一個基本遍歷,我知道它正確地完成,甚至停止在終止條件(b [k * 4 + 4] == 1),但它沒有返回正確的值。

目前,總是返回0.檢查總是等於0,儘管一旦滿足條件它會停止。我也嘗試刪除結尾返回0;雖然檢查仍然等於零......

+0

我知道,我可以通過一個指針,用於檢查和簡單的集檢查= 1,然後返回。我可以證實,這**做**工作,但希望有一個更清晰的方式來做到這一點與回報。 –

回答

1

你只需要檢查你的遞歸​​調用,即返回值,

return recursion(a, b, c, d, e, f); 
+0

這打破了遍歷,它沒有完成。 –

0

你需要做return recursion(a, b, c, d, e, f);,而不是僅僅recursion(a, b, c, d, e, f);。否則,這些遞歸調用的結果將會丟失。

編輯:不要過早地退出你的循環,你可以這樣做:

int check = recursion(a, b, c, d, e, f); 
int recursion(int *a, int *b, int c, int d, int e, int f){ 
    int k, dX, dY; 
    for(k=0;k<=b[1]-1;k++){ 
     dX = b[k*4+3] - e; 
     dY = b[k*4+2] - f; 
     if(((dX == 1 || dX == -1) && (dY == 0))){ 
      if(b[k*4+4] == 1) return 1; 
      e = b[k*4+3]; 
      f = b[k*4+2]; 
      b[k*4+2] = b[k*4+3] = 0; 
      if(recursion(a, b, c, d, e, f) == 1) 
       return 1; 
     } 
     if(((dY == 1 || dY == -1) && (dX == 0))){ 
      if(b[k*4+4] == 1) return 1; 
      e = b[k*4+3]; 
      f = b[k*4+2]; 
      b[k*4+2] = b[k*4+3] = 0; 
      if(recursion(a, b, c, d, e, f) == 1) 
       return 1; 
     } 
    } 
    return 0; 
} 
+0

這打破了遍歷,它沒有完成。 –

+0

你仍然需要找到一種方法來使用你的遞歸調用。目前你所做的只是調用函數,然後放棄返回,這實際上是無用的。也許你想設置一個有條件切換爲1的標誌,那麼你可以在你的函數結束時返回這個標誌? –

+0

這很有道理。使用通過未來呼叫並在退出時返回的標誌將起作用。感謝@紅色警報! –