Вы петля 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
.
Можете ли вы показать мне этот код с вектором? – beginnerjohn