4

以下の擬似コードは、実行したい計算を示しています。アイデアは、任意の数学関数を取りx、最初の項の合計を評価する C/C++ 関数を設計するNことです。function(x)などの任意の関数である可能性があります2x-1 , 2x , 1/x。からまでx変化します。課題はデータ構造をどのように設計するかだと思いますが、これがデータ構造なしで達成できるかどうかはわかりません(これはより良いでしょう)。zeroNfunction(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)また、cumulate には、デフォルトの代わりに二項演算子が必要ですsum+=x

C++ では、他の関数を受け取る関数は、正確に何を呼び出しているかについての仮定を回避します。これは に見られますstd::accumulate: これはテンプレートなので、あらゆる種類の関数 (およびあらゆるタイプの入力イテレーター) を受け入れることができます。

于 2015-08-21T09:01:27.943 に答える
1

ユースケースでは、C++ が持つ非常に簡単で汎用的なテンプレート機能を使用できます。

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

std::functionこれは、ラムダ、単純な関数、 s、ファンクターなどを含む、1-D 数学関数として使用できるものをすべて処理します( Live )

これも 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

その関数は、実行時にユーザーが入力することになっていますか、それともコンパイル時にそれを使用できますか? 2番目のケースでは、それは些細なことです。実行時に評価する必要がある場合は、文字列を解析して式の表現 (通常はツリー) を作成する必要があります。Google "Parsing Trees" およびc/c++ での数学式の解析も参照してください

于 2015-08-21T08:41:05.893 に答える