シーケンスがあります。
a1 = 1 - cos(x);
ai = a1 + (-1)^(i-1) * x^(2*i-2) / (2*i-2)!
これを再帰ありとなしで書く必要があります。しかし、それは異なる結果をもたらします。
ここに私のコードがあります: http://codepaste.net/q213q6
シーケンスがあります。
a1 = 1 - cos(x);
ai = a1 + (-1)^(i-1) * x^(2*i-2) / (2*i-2)!
これを再帰ありとなしで書く必要があります。しかし、それは異なる結果をもたらします。
ここに私のコードがあります: http://codepaste.net/q213q6
これは宿題であるという前提で操作します。間違っている場合は、戻ってこの投稿を編集または再投稿します。
まず、階乗関数を末尾再帰的に書くようにしてください。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 回の反復と考えてください。
浮動小数点演算を実行しているため。実装方法が異なれば、異なる結果が生じる可能性があります。あなたの場合、損失が発生する場所を 1 つ思いつくことができます
currC = pow(x, 2*i-2);
等しくない
47: currC = currC * x * x;
詳細については、 http://en.wikipedia.org/wiki/Floating_point#Multiplication