【问题标题】:C++ Horner's Rule - Recursive Array ImplementationC++ Horner's Rule - 递归数组实现
【发布时间】:2020-04-04 21:21:57
【问题描述】:

我已经使用数组实现了Horner's Method,如下所示。

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;
}

我对指针算法有点陌生,有几个问题:

  1. 我犯了什么罪吗?有更好的方法吗?
  2. 类似的实现使用std::vector 并避免传递数组大小n。这两种实现方式的优缺点是什么?

【问题讨论】:

  • 可以在这里发布代码片段,例如可以在coliru.stacked-crooked.com 上运行?这也看起来像递归函数,肯定可以用单循环代替。
  • 注意最后一次迭代
  • std::vector 版本的优点是您不必担心罪恶。这真的不是关于“罪”,而是关于更容易使用、更不容易出错并且语法更易读的东西。
  • 顺便说一句,在这里使用迭代器可能更方便,否则您仍然需要跟踪向量中的索引(或制作副本)

标签: c++ arrays vector


【解决方案1】:

使用新的 C++ 编译器,现代方法是使用 std::span 或 gsl::span 参数。它包含指针和长度,可以很容易地从中构建子数组。

取决于n,如果将n更改为模板参数,它可以提高性能。然后递归可以毫无问题地展开,编译器可以发挥它的优化魔法。

您也可以通过手动转换为循环来展开。

这完全取决于你的目标。该功能是否应该正常工作。还是对性能至关重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 2019-11-05
    • 1970-01-01
    • 2018-08-07
    • 2019-04-07
    相关资源
    最近更新 更多