Возврат из рекурсии (c / c ++)

0

У меня возникают проблемы с возвратом желаемого значения в рекурсивный вызов. Я хочу, чтобы он всегда возвращал 0, если не выполняется определенное условие, в этом случае он должен возвращать 1 и выйти.

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 в любой точке, тогда проверка должна равняться 1. В противном случае верните 0 и проверьте value = 0. Он завершает базовый обход, который, как я знаю, выполняется правильно и даже останавливается при завершающем условии (b [k * 4 + 4] == 1), но он не возвращает правильное значение.

В настоящее время он ВСЕГДА возвращает 0. Проверка всегда равна 0, хотя она останавливается после выполнения условия. Я также попытался удалить окончание return 0; хотя проверка все равно равна нулю...

  • 0
    Я знаю, что могу передать указатель на проверку и просто установить check = 1, а затем вернуться. Я могу подтвердить , что это работает, но надеялся , что там было чище способ сделать это с возвратами.
Теги:
recursion
return-value
return

2 ответа

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); , В противном случае результат этих рекурсивных вызовов будет потерян.

edit: чтобы не досрочно выйти из цикла, вы можете сделать это:

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, тогда вы можете вернуть его в конце своей функции?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню