Проверить, состоит ли массив только из 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
→ Ссылка
Когда массив нулевой?
- Когда он пустой.
- Когда он не пустой и его средний элемент равен нулю и его часть до среднего элемента нулевая и его часть после среднего элемента нулевая.
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));
}
Ещё один вариант на ту же тему. Когда массив нулевой?
- Когда он пустой.
- Когда в нём один элемент и это ноль.
- Когда в нём больше одного элемента и его левая половина нулевая и его правая половина нулевая.
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);
}