2015-05-05 2 views
0

EDIT Я получил этот код для работы с массивом, но я не могу заставить его работать с вектором, знает ли кто-нибудь, как я могу его изменить, используя массив вектор?C++ using recursion найти количество ненулевых элементов в векторе

int count(double* arr, int length); 

int main() 
{ 
double arr[10] = {0.0, 1.3, 2.5, 11.34, 0.0, 9.8, 6.4, 0.0, 4.3, 0.0}; 

cout << "There are " << count(arr, 10) << " nonzeros in this array!\n\n"; 

return 0; 
} 

int count(double* arr, int length) 
{ 
if (!length) 
{ 
    return 0; 
} 

int c = count(arr+1, length-1); 

return arr[0] != 0.0 ? c + 1 : c; 
} 

ответ

0

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

Я думаю, что один из вариантов может быть это:

int nonzeros(double digits[], int s, int i) 
{ 
    if (i == s) 
    { 
     return 0; 
    } 
    else if (digits[i] != 0.0) 
    { 
     return (1 + nonzeros(digits, s, i + 1)); 
    } 
    else 
    { 
     return (nonzeros(digits, s, i + 1)); 
    } 
} 
2

Вы петля while (i < s) никогда не выход, так как вы не изменяли ни i, ни s в петле.

Фактически вы можете сделать функцию немного проще, прежде всего, не имея цикла (для чего предназначена рекурсия), а затем понимая, что вам нужны только размер и текущий индекс в качестве аргументов. Тогда вы могли бы сделать это как

int nonzeroes(double* digits, size_t size, size_t index) 
{ 
    if (index < size) 
    { 
     return (digits[index] != 0.0) + nonzeroes(digits, size, index + 1); 
    } 
    return 0; 
} 

Это работает, потому что логические значения могут быть неявно преобразованы в int с true быть 1 и false быть 0. Затем он добавляет возвращаемое значение следующего индекса, который извлекается с помощью рекурсивного вызова.

Первоначальный вызов с вашего main функции должен быть как

nonzeroes(digits, s, 0) 

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

Я рекомендую вам использовать отладчик для прохождения кода по строкам, при вводе рекурсивных вызовов, чтобы увидеть, как он работает.


На боковой ноте, если вы хотите динамический массив в C++, вы должны использовать std::vector.

На другой боковой ноте, для простых случаев, как ваши по сравнению с 0.0 будет работать, но если вы создаете значения с помощью других алгоритмов или арифметики то будет усугубляться ошибками округления, которая означает, что значение может быть близко но не полностью равна нулю. Это можно решить, используя значение epsilon, например, используя std::numeric_limits<double>::epsilon.

+0

Можете ли вы показать мне этот код с вектором? – beginnerjohn

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