2013-11-26 3 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; 
} 

Много несущественной информации была удалена, но, как вы можете увидеть, если б [к * 4 + 4] == 1 на AnyPoint, чек должен тогда равен 1. В противном случае возвращает 0, и проверка будет = 0. Он завершает базовый обход, который, как я знаю, выполняется правильно и даже останавливается при завершающем условии (b [k * 4 + 4] == 1), но он не возвращает правильное значение.

В настоящее время он ВСЕГДА возвращает 0. Проверка всегда равна 0, хотя она останавливается после выполнения условия. Я также попытался удалить окончание return 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

Это имеет смысл. Использование флага, который пройдет до будущих вызовов и возврата после выхода, будет работать. Спасибо @Red Alert! –

Смежные вопросы