Проверить, состоит ли массив только из 0-ых элементов

нужно написать рекурсивную функцию для проверки является ли массив нулевым или нет.

#include <iostream>
using namespace std;

int zero(int *x, int n) {
    int i = 0;
    if (i != n && x[i] == 0) {
        return x[i + 1];
    }
    return 1;
}

int main()
{
    int n = 5, c;
    int *arr = new int[n];
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }

    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
    c = zero(arr, n);
    if (c == 1) cout << "the array consists of zeros.";
    else cout << "the array not consists of zeros.";
}

Вот что смог придумать, но не работает. Не совсем понимаю как реализовывать рекурсию.


Ответы (2 шт):

Автор решения: Harry

Когда массив нулевой? Когда его последний элемент нулевой, и массив без него тоже нулевой.

bool zero(int *x, int n) 
{
    if (n == 0) return true;
    if (x[n-1]) return false;
    return zero(x,n-1);
}
→ Ссылка
Автор решения: Stanislav Volodarskiy

Когда массив нулевой?

  1. Когда он пустой.
  2. Когда он не пустой и его средний элемент равен нулю и его часть до среднего элемента нулевая и его часть после среднего элемента нулевая.
bool is_zero(int n, const int x[/* n */]) {
    if (n == 0) {
        return true;
    }
    const int m = n / 2;
    return x[m] == 0 && is_zero(m, x) && is_zero(n - (m + 1), x + (m + 1));
}

Ещё один вариант на ту же тему. Когда массив нулевой?

  1. Когда он пустой.
  2. Когда в нём один элемент и это ноль.
  3. Когда в нём больше одного элемента и его левая половина нулевая и его правая половина нулевая.
bool is_zero(int n, const int x[/* n */]) {
    if (n == 0) {
        return true;
    }
    if (n == 1) {
        return x[0] == 0;
    }
    const int m = n / 2;
    return is_zero(m, x) && is_zero(n - m, x + m);
}
→ Ссылка