Итерационный метод к Рекурсивному методу C Язык - PullRequest
0 голосов
/ 04 мая 2020

Я попытался преобразовать этот метод, который уже работает в моей программе, в рекурсивный способ. Потому что меня попросили это сделать. Дело в том, что я попытался посмотреть ниже, но в моем методе, когда я пытаюсь добавить в положение метода значение, это значение является большим числом и создает сегментацию.

Это мой метод итеративным способом:

int researchList_getPosByCountry(tResearchList* list, tCountry *country) {

// Check preconditions
    assert(list != NULL);

    tResearchListNode *prev = NULL;
    int pos;


    // check if is an empty list 
    if (researchList_empty(list)) {
        pos = -1;
    }
    else{

        pos = 1;
        prev = list->first;
        while ((prev != NULL) && !country_equal(prev->e->country, country) ) {
            prev = prev->next;
            pos++;
        }
    }

    if (prev == NULL) {
        pos = -1;        
    }

    return pos;
}

Это мой метод рекурсивным способом:

 assert(list != NULL);

    tResearchListNode *prev;
    int pos;


    // check if is an empty list 
    if (researchList_empty(list)) {
        pos = -1;
    }
    else{
        pos = 1;
        prev = list->first;
        if ((prev != NULL) && !country_equal(prev->e->country, country) ) {

            prev = prev->next;
          pos = pos + researchList_getPosByCountry(list, country); //Debugging the segmentation is here
        }


    }

1 Ответ

1 голос
/ 04 мая 2020

Вы получите бесконечную рекурсию, так как вы вызываете researchList_getPosByCountry всегда начиная с начала списка; снова и снова и ...

Я предлагаю вам ввести вторую (затем рекурсивно используемую) функцию, которая вызывает себя с соответствующим следующим узлом и возвращает (а) «наибольшее» возможное отрицательное число, если узел не был найдено (что превращает любые промежуточные результаты в стеке вызовов в отрицательные) или возвращает 0, чтобы обозначить «страна найдена, посчитать до сих пор» или «1 + следующая попытка», чтобы продолжить подсчет. Рекурсивная часть может выглядеть следующим образом; Затем вам нужно вызвать его из вашего int researchList_getPosByCountry(tResearchList* list, tCountry *country) и интерпретировать отрицательный результат соответственно:

int researchList_getPosByCountry(tResearchListNode* node, tCountry *country) {
    if (!node) {
       return INT_MIN;
    } else if (countryEqual(...)) {
       return 0;
    } else {
       return 1 + researchList_getPosByCountry(node->next,country);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...