0

シーケンスがあります。

a1 = 1 - cos(x);
ai = a1 + (-1)^(i-1) * x^(2*i-2) / (2*i-2)!

これを再帰ありとなしで書く必要があります。しかし、それは異なる結果をもたらします。
ここに私のコードがあります: http://codepaste.net/q213q6

4

2 に答える 2

1

これは宿題であるという前提で操作します。間違っている場合は、戻ってこの投稿を編集または再投稿します。

まず、階乗関数を末尾再帰的に書くようにしてください。C ではおそらく大きな違いはありませんが、良い習慣です。

int helper( int x, int acc ) {
    if( x == 0 ) {
        return acc;
    }
    else {
      return helper( x - 1, acc * x );
    }
}

int factorial( x ) {
  helper( x, 1 );
}

次に、通常、再帰関数の中にループを入れたくありません。再帰呼び出しは、テストとリターンまたはリコールを伴う 1 回の反復と考えてください。

于 2010-03-11T17:36:46.377 に答える
0

浮動小数点演算を実行しているため。実装方法が異なれば、異なる結果が生じる可能性があります。あなたの場合、損失が発生する場所を 1 つ思いつくことができます

currC = pow(x, 2*i-2);

等しくない

  47:          currC = currC * x * x;

詳細については、 http://en.wikipedia.org/wiki/Floating_point#Multiplication

于 2010-03-11T17:48:04.193 に答える