3

再帰的でなければならない正弦関数を書いています。正弦関数を作成しましたが、再帰的に行う方法がよくわかりません。誰かがこれを始める方法を説明できますか?

これは私がこれまでに持っているものです:

/*--------------------------------------------------------------
Name: sine( double X );

Return: Function "sine" will return the 
sine of X, where X is measured in radians.
--------------------------------------------------------------*/

double sine(double X)
{
  double result = 0;
  double term;
  int k;
  double lim;

  k = 0;
  lim = power(10, -8); 
  term = power(-1, k)*power(X, ((2*k) + 1)) / (factorial((2*k)+1));  
  result = term;
  while (absolute(term) > lim)  
  {
    k += 1;
    term = power(-1, k)*power(X, ((2*k) + 1)) / (factorial((2*k)+1));  
    result += term;
  }


  return result;
}

編集:これを解決するためにラッパー関数を使用しました。基本的に、と呼ばれる別の関数を作成しました

double sine_rec(double X, double k)

それに合わせて現在のコードを変更しました。

4

2 に答える 2

4

私がこれに取り組む方法は、別の整数パラメーターをとる別の関数sine(double X, int n)、つまりべき級数近似に含める項の数を持つことです。次に、この関数は次のようなものを返す可能性があります( n = 1を処理[nth term in series] + sine(X, n - 1)する前のステートメントを覚えておいてください)。if

于 2012-04-26T21:04:12.313 に答える
0

while次の方法で再帰によってループを排除できます。

double sine(double X, int k = 0)
{
  double result = 0;
  double term;
  double lim;

  lim = power(10, -8); 
  term = power(-1, k)*power(X, ((2*k) + 1)) / (factorial((2*k)+1));  
  if (absolute(term) > lim)  
  {
    return sine(X, k+1) + term; 
  }
  else
  {
    return term;
  }
}

しかし、私はこれを行うことをまったくお勧めできません。(この再帰に対してもより良い解決策がありますが、自分で見つけてください)

于 2012-04-26T21:03:21.637 に答える