下面的伪代码描述了我想要做的计算。我们的想法是设计一个C / C ++函数,它接受x
的任何数学函数,并评估第一个N
项的总和。 function(x)
可以是任何功能,例如2x-1 , 2x , 1/x
等。 x
从zero
到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 ;
}
答案 0 :(得分:2)
你正在重塑std::accumulate
。 (你使用x = 0 ... N可以通过boost的计数迭代器来处理,而accumulate则需要二元运算符sum += f(x)
而不是默认的sum+=x
。
在C ++中,采用其他函数的函数避免假设它们正在调用的内容。您在std::accumulate
中看到了这一点:它是一个模板,因此它可以接受任何类型的函数(以及任何类型的输入迭代器)。
答案 1 :(得分:1)
对于您的用例,您可以使用C ++具有的非常简单和通用的模板功能:
template <class MathFunction>
double foo (MathFunction function) {
return function(1);
}
这可以处理任何可用作1-D数学函数的东西,包括lambdas,普通函数,std::function
s,仿函数等。(Live)
由于这也标记为C而上面是C ++,您还可以使用函数指针:
double fun (double (*function)(double)) {
return function(1);
}
这适用于普通功能,无论如何你都可以使用它。 (Live)
答案 2 :(得分: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;
}
答案 3 :(得分:0)
该函数是否应该由用户在运行时输入,或者您是否可以在编译时使用它? 在第二种情况下,它是微不足道的。 如果需要在运行时进行求值,则需要解析字符串并创建表达式的表示(通常是树)。 谷歌“解析树”,也看parsing math expression in c/c++
答案 4 :(得分: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
指针给出的模式。
因此2x-1
的函数必须如下所示:
int f1(int x) {
return 2 * x - 1;
}
同样的事情也适用于其他人。所以只有逻辑改变,而不是函数参数或返回类型