Правило C ++ Хорнера - Рекурсивная реализация массива - PullRequest
0 голосов
/ 05 апреля 2020

Я реализовал метод Хорнера , используя массивы следующим образом.

double hornerRule( const double x, const double a[], const int n ) {
    double ans = *a;
    if ( n > 0 ) { ans += x * hornerFunction( x, ++a, n - 1 ); }
    return ans;
}

Я немного новичок в арифметике указателей c и у меня есть несколько вопросов:

  1. Я совершил какие-либо грехи? Есть ли лучший способ сделать это?
  2. Аналогичная реализация использует std::vector и избегает передачи размера массива n. Каковы плюсы / минусы этих двух реализаций?

1 Ответ

0 голосов
/ 05 апреля 2020

С новым компилятором C ++ современный способ будет иметь параметр std :: span или gsl :: span. Он содержит указатель и длину, из него можно легко создавать подмассивы.

В зависимости от n, это может улучшить производительность, если вы измените n на параметр шаблона. Тогда рекурсия может быть развернута без проблем, и компилятор может выполнить оптимизацию magi c.

Вы можете выполнить развертывание путем ручного конвертирования в al oop тоже.

Все это зависит от ваших целей. Должна ли функция просто работать правильно. Или это критично для производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...