Псевдокод ниже изображает вычисление, которое я хочу сделать. Идея заключается в разработке функции 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 ;
}
Вы изобретаете std::accumulate
. (Ваше использование с x = 0 … N может быть обработано итератором подсчета Boost, и накапливать может потребоваться бинарный оператор sum += f(x)
вместо по умолчанию sum+=x
,
В C ++ функции, которые принимают другие функции, избегают предположений о том, что именно они вызывают. Вы видите это в std::accumulate
: это шаблон, поэтому он может принимать любые функции (а также любые типы входных итераторов).
Для вашего варианта использования вы можете использовать очень простую и универсальную функцию шаблона, которая есть в C ++:
template <class MathFunction>
double foo (MathFunction function) {
return function(1);
}
Это обрабатывает все, что может быть использовано как одномерную математическую функцию, включая лямбда-выражения, простые функции, std::function
с, функторы и т. д. (Жить)
Так как это также помечено C и выше C ++, вы также можете использовать указатели функций:
double fun (double (*function)(double)) {
return function(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;
}
Предполагается, что эта функция будет введена пользователем во время выполнения или вы можете просто использовать ее во время компиляции?
Во втором случае это тривиально.
Если вам нужно выполнить оценку во время выполнения, вам нужно проанализировать строку и создать представление выражения (обычно дерева).
Google «Парсинг деревьев» и посмотреть также на разбор математического выражения в c / c ++
Это моя проблема (ответ 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;
}
И то же самое относится и к другим. Таким образом, изменяется только логика, но не параметры функции или тип возвращаемого значения.