2013-04-28 2 views
0

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

Вот что я заметил: размер в настоящее время установлен на 5. Для его проверки я изменяю строку if (i == size) в части вычитания функции, если (i == (размер - 3)), и кажется, что он вычитает второй элемент правильно из первого элемента (4 - 2). Но если я позволю ему снова запустить, я получаю 9 вместо (4-2) - 7 = -5, которые я должен получить. Возможно ли это добавить -7?

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

#include<iostream> 

using namespace std; 


int reduceArray(int array[], int size, char op, int i = 0) 
{ 
    if(op == '+') 
    { 
     if(size == 0) 
     return 0; 

     if(i == size) 
     return 0; 

     else 
     { 
      return array[i++] + reduceArray(array, size, '-', i + 1); 
     } 
    } 

    else if(op == '-') 
    { 
     if(size == 0) 
     return 0; 

     if(i == (size - 2)) //changing this to "size - n" changes how many numbers are subtracted 
     return 0; 

     else 
     { 
      return array[i++] - reduceArray(array, size, '-', i + 1); 
     } 
    } 
} 

int main() 
{ 
    int array[] = {4, 2, 7, 1, 9}; 

    //cout << reduceArray(array, 5, '+') << endl; this bit works fine works fine 
    cout << reduceArray(array, 5, '-') << endl; 
    system("pause"); 
    return 0; 
} 

EDIT: Вообще - то же самое происходит в программе разделения. Для третьего элемента массива (7) он выполняет операцию INVERSE - когда она должна вычитать, она добавляет, когда она должна делиться, она умножается - не может понять, почему это происходит.

ответ

0

Вы изменяете i сразу после вызова функции. После возврата функции i был увеличен на единицу. Когда вы извлекаете значение от array[i], вы извлекаете неправильный элемент, в основном вы делаете array[i + 1] =. Вы также получаете доступ к элементу за пределами массива.

Этот код для операторов выполняет вычисления справа налево, а не слева направо, как вы ожидаете. Вы всегда вызываете reduceArray до того, как будет выполнен расчет, чтобы он доходил до конца массива, а затем возвращался обратно (возвращался) и выполнял вычисления после каждого возврата времени. Чтобы исправить это, вам нужно выполнить вычисления до того, как вы вызовете reduceArray, затем выполните другой расчет по возвращаемому результату.

if(i < (size - 3)) // This MUST be -1 in order to go to the end of the array! 
{ 
    // We're operating on the current array entry and the next entry. 
    // this is why (size - 1) is necessary to prevent accessing beyond 
    // the end of the array. 
    int result = array[i] - array[i + 1]; 
    i += 2; 
    return result - reduceArray(array, size, '-', i); 
} 
return array[i]; 

Это возвращает -5 как результат, который является то, что вы ожидаете.

+0

Имеет смысл. Я отредактировал свой код соответствующим образом, но я все равно получаю одинаковые результаты. Он запускается правильно - сначала я получаю 4, затем он вычитает 2, и я получаю 2, но вместо этого вместо вычитания 7 (следующий элемент в массиве) кажется, что он добавляет его, потому что вместо этого я получаю 9 вместо от -7. – user2302335

+0

Когда 'reduceArray' возвращает отрицательное число, вы вычтите его из числа в массиве. '1 - -5 = 6 ', поэтому он _looks_, как будто вы добавляете число. –

+0

Как я мог исправить это? abs() возможно? – user2302335

Смежные вопросы