Рекурсивный вопрос (сумма нечетных чисел в массиве) в C - PullRequest
0 голосов
/ 28 мая 2020

У меня есть вопросы о функции рекурсии. Программа должна вычислять сумму n нечетных целых чисел, и каждый раз, когда мы находим сумму, мы должны вывести следующее:

Например, если пользователь дает 5 чисел (5,4,3 , 2,1), список будет выглядеть следующим образом:

5 4 3 2 1

Затем будет напечатано:

5 [0] (Да) 4 [5] (Да) 3 [5] (Да) 2 [8] (Нет) 1 [8] (Нет)

Сначала выводится число, затем в [] сумму следующего нечетного числа и в конце в скобках (Да) или (Нет), если число ^ 2 в каждом узле больше суммы его следующих нечетных чисел. Как и в первом случае, 5> 0, так что это да.

Я написал это до сих пор, но не могу его распечатать, чего-то не хватает?

int checkSumOfOdds(struct list *ptr) {
    int k=0;

    if (ptr != NULL){
        k = checkSumOfOdds(p->next);
        if((ptr->next)^2 > k){
            printf(" %d [%d] (YES)",ptr->value, k);}
        else{
            printf(" %d [%d] (YES)",ptr->value, k);}

        k += ptr->value;
        return k;
    }

    return 0;
}

1 Ответ

0 голосов
/ 28 мая 2020

Согласно постановке задачи, отображаемые значения - от первого до последнего ввода. Сначала идет «5», затем «4» ...

Это определяет, как ведет себя рекурсивная функция. Сначала он сам себя вызывает или в конце? В вашем случае значения заголовка должны быть обработаны в первую очередь, поэтому рекурсивный вызов должен выполняться после обработки числа. В конце.

Тогда ваш тест if (ptr != NULL) должен влиять только на рекурсивный вызов, а не на все тело.

Оператор ^ является исключающим ИЛИ в C ... Вероятно не то, что вы хотите (хотя можно использовать, но не так). Чтобы проверить, является ли число нечетным, просто проверьте его первый бит (с помощью & 1) или проверьте, соответствует ли N % 2 > 0.

Поскольку номер обрабатывается и отображается раньше (потому что рекурсивный вызов находится в конце), вы можете переносить сумму с помощью вызовов.

Я предполагаю, что отображаемая сумма должна начинаться с текущего числа (или, в качестве упражнения, просто отложите суммирование ... ).

Пример кода, который должен работать

int checkSumOfOdds(struct list *ptr, int sum) {
     int isodd = ptr->value & 1;
     if (isodd) sum += ptr->value;
     printf("%d[%d](%s) ", ptr->value, sum, isodd ? "Yes":"No");
     return ptr->next ? checkSumOfOdds(ptr->next, sum) : sum;
}

для вызова

 checkSumOfOdds(headOfList, 0);
 printf("\n");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...