реализация рекурсивной функции - PullRequest
1 голос
/ 06 марта 2020

Я все еще очень плохо знаком с рекурсивом и хочу вернуть 3 из этого массива int arr[size] = {21, -6, 3, 5, 5, -3, 6, -21} за то же самое абсолютное значение с рекурсивной реализацией.

Однако я получаю значение 0. Я не могу точно определить, что делает эту программу не приносящей желаемого значения.

#include <iostream>

using namespace std;

int additive_inverse_opposite_pairs_count(int* arr, int n) {
  int size = n;

  if (n == 0) {
    if (arr[n] == -1 * arr[size - 1 - n])
      return 1;
    else
      return 0;
  } else {
    int count = additive_inverse_opposite_pairs_count(arr, n - 1) + count;
    if (arr[n] == -1 * arr[size - 1 - n]) {
      count += 1;
    } else
      count = 0;
    return count;
  }
}

int main() {
  int size = 8;
  int arr[size] = {21, -6, 3, 5, 5, -3, 6, -21};
  int value = 0;

  value = additive_inverse_opposite_pairs_count(arr, size);
  cout << "value: " << value << endl;

  return 0;
}

1 Ответ

0 голосов
/ 06 марта 2020

Частично проблема в том, что вы обращаетесь к arr[n], где n - это размер массива. Допустимые значения массива: 0..n-1, поэтому вам нужно изменить arr[n] на arr[n-1] в else части вашего оператора if.

Одна из идей - просто начать с index i, просканируйте оставшуюся часть массива с этой точки на наличие аддитивного обратного, и, если он найден, верните это число, в противном случае вернитесь дальше в массив. Я написал вспомогательную функцию для выполнения работы.

int helper(int* arr, int i) {
  if (i == 0) {
    return 0;
  }
  for (int j = i - 1; j >= 0; j--) {
    if (arr[i] == -arr[j]) {
      return abs(arr[i]);
    }
  }
  return helper(arr, i - 1);
}

int additive_inverse_opposite_pairs_count(int* arr, int n) {
  return helper(arr, n - 1);
}
...