Visual Studio и онлайн компилятор выводят разные ответы на одну и ту же задачу
Задача состояла в том, чтобы вывести одномерный массив, перед этим уменьшив (с помощью рекурсии) его четные элементы на значение суммы индексов нечетных элементов (сумму также нужно найти с помощью рекурсии) и вывести полученный одномерный массив.
Сначала я написал код в VS и он вывел мне неправильный ответ (input: (len 5) 12 10 3 4 5 -> output: 1 -1 3 -7 5)). Чётные элементы должны уменьшаться на 6, так как индекс числа 3 это 2, а числа 5 - 4. То есть их сумма 6, но никак не 11, как мне насчитал VS. Я долго не мог понять в чём проблема, пока тупо не скопировал код и не вставил его в онлайн компилятор (onlinegdb), который показал мне уже верный ответ (input (len 5) 12 10 3 4 5 -> output: 6 4 3 -2 5). Подскажите, пожалуйста, в чём может быть проблема?
#include <iostream>
using namespace std;
int sum(int *a, int n, int i) {
if (n < 0) return 0;
if (a[i] % 2 != 0) return sum(a, n - 1, i + 1) + i;
else return sum(a, n - 1, i + 1);
}
void decrease(int* a, int n, int i, int x) {
if (n >= 0) {
if (a[i] % 2 == 0)
a[i] -= x;
decrease(a, n - 1, i + 1, x);
}
}
int main() {
int n;
cin >> n;
int* a = new int[n];
for (int i = 0; i < n; i++)
cin >> a[i];
decrease(a, n, 0, sum(a, n, 0));
for (int i = 0; i < n; i++)
cout << a[i] << " ";
}
Ответы (1 шт):
На вопрос полностью правильно ответил wololo.
От себя пару моментов. У вас n - это количество элементов в массиве. Почему рассматриваете её как индекс элемента и сравниваете с 0?
Хотя идея в принципе-то верная! В рекурсивных функциях переменная i - излишняя. Зачем вам отдельная переменная под индекс? Вы же передаете рекурсивно уменьшая значение n - чем не индекс?
int sum(int *a, int n)
{
if (n < 0)
return 0;
cout << n << " ";
if (a[n] % 2 != 0)
return sum(a, n - 1) + n;
else
return sum(a, n - 1);
}
Используя n в качестве индекса при доступе к массиву вы точно будете помнить, что она изменяется от количество эл-ов - 1 до 0. Заодно уменьшили количество аргументов в рекурсивных функциях, что уменьшит заполнение отнюдь не резинового стека.
Ну и как всегда - если выделили память через new[], то освобождайте её через delete[]. Не стоит привыкать к автоматическому освобождению при завершении программы.