4

下面的伪代码描述了我想要做的计算。这个想法是设计一个 C/C++ 函数,该函数采用任何数学函数x并评估第一N项的总和。function(x)可以是任何函数,例如2x-1 , 2x , 1/x等。xzero到变化N。我认为挑战是如何设计数据function(x)结构,不确定在没有任何数据结构的情况下是否可以实现(这会更好)。

   function(x) = 2*x - 1 ;              

   sum_expression_to_N(  function(x)  , N ){

      float sum = 0.0;

      for ( int x =0; x<=N; x++){
           sum = sum +  function(x)       
      }
      return sum ;
  }
4

5 回答 5

2

你正在重新发明std::accumulate。(您对 x=0...N 的使用可以通过 boost 的计数迭代器来处理,并且累积需要二元运算符sum += f(x)而不是默认的sum+=x.

在 C++ 中,采用其他函数的函数避免对它们调用的确切内容做出假设。你在std::accumulate: 它是一个模板,因此它可以接受任何类型的函数(以及任何类型的输入迭代器)。

于 2015-08-21T09:01:27.943 回答
1

对于您的用例,您可以使用 C++ 具有的非常简单和通用的模板功能:

template <class MathFunction> 
double foo (MathFunction function) {
    return function(1);
}

它处理任何可以用作一维数学函数的东西,包括 lambdas、普通函数、std::functions、仿函数等。(实时

由于这也被标记为 C 并且上面是 C++,因此您还可以使用函数指针:

double fun (double (*function)(double)) {
    return function(1);
}

这适用于普通函数,这就是你在 C 中所拥有的一切。(直播

于 2015-08-21T08:51:54.450 回答
1

这在现代 C++ 中是微不足道的。例如,你可以写

#include <iostream>

template <typename F>
float sum_expr_to_n(F f, int n) {
    float sum = 0;
    for (int i = 0; i <= n; ++i) sum += f(i);
    return sum;
}

int main() {
    auto f = [](int x) { return 2 * x - 1; };
    std::cout << sum_expr_to_n(f, 3) << std::endl;
}
于 2015-08-21T09:13:27.820 回答
0

这是我的破解(C++ 答案):

#include <iostream>
#include <vector>

using func = int (*)(int);

// define your functions here -> f1, f2, f3,...

int main() {
    std::vector<func> functions = {f1, f2, f3,...};

    for (func f : functions) {
        int sum = 0;
        for (int x = 0; x <= N; x++) {
           sum = sum + f(x)       
        }
        std::cout << sum << '\n';
    }
    return 0;
}

请注意,您定义的函数应遵循func指针给出的模式。

所以 this 的函数2x-1必须如下所示:

int f1(int x) {
    return 2 * x - 1;
}

其他人也是如此。所以只有逻辑改变,而不是函数参数或返回类型

于 2015-08-21T08:51:28.973 回答
0

该函数应该由用户在运行时输入还是可以在编译时使用?在第二种情况下,这是微不足道的。如果您需要在运行时进行评估,您需要解析字符串并创建表达式的表示(通常是树)。谷歌“解析树”并查看在 c/c++ 中解析数学表达式

于 2015-08-21T08:41:05.893 回答