Сравнение двух массивов с рекурсивной функцией без LOOP - PullRequest
0 голосов
/ 21 июня 2020
bool areEqual(int *A1, int size1, int *A2, int size2)
{
int index = 0;
if (size1 != size2) 
    return false;

else if (A1[index] != A2[index])
    return false;
else
{
    index++;
    areEqual(A1, size1, A2, size2);
}
return true;
}

Я работаю с этой рекурсивной функцией, но каждый раз два массива имеют одинаковый размер. Он возвращает переполнение стека. Почему это? И как исправить?

Ответы [ 2 ]

0 голосов
/ 21 июня 2020

Ваша версия вызывает точно с тем же аргументом, создавая бесконечную рекурсию.

Возможный вариант без дополнительного параметра:

bool areEqual(const int* A1, int size1, const int* A2, int size2)
{
    if (size1 != size2) return false; 
    if (size1 == 0) return true; // end of array

    if (A1[0] != A2[0]) return false; // current char differs
    return areEqual(A1 + 1, size1 - 1, A2 + 1, size2 - 1);
}
0 голосов
/ 21 июня 2020

index всегда 0. Вы должны передать его как параметр и проверить, иначе он не закончится.

bool areEqual(int *A1, int size1, int *A2, int size2, int index=0)
{
    if (size1 != size2) return false; 
    if (index == size1) return true;

    if (A1[index] != A2[index]) return false;
    return areEqual(A1, size1, A2, size2, index+1);
}

Вы можете разделить его на 2 функции, что более понятно.

bool areEqualRecursive(const int *A1, const int *A2, const int size, int index){
    if (index == size) return true;
    
    if (A1[index] != A2[index]) return false;
    return areEqualRecursive(A1, A2, size, index+1);
}

bool areEqual(const int *A1, const int size1, const int *A2, const int size2){
    if(size1 != size2) return false;
    if(A1 == A2) return true;
    
    return areEqualRecursive(A1, A2, size1, 0);
}

Вызов оба случая:

bool is_equal = areEqual(arr1, size1, arr2, size2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...