2012-04-26 10 views
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) 

と呼ばれる別の関数を作成し、現在のコードを変更してそれに適合させました。

+2

この宿題はありますか?だから、私はむしろあなたに完全な答えよりもヒントを与えて、あなたのために楽しいものを奪うでしょう。 – Mads

+0

@Madsそれは宿題タグを持っています....たぶん追加されましたか? – kenny

+0

これはGoogleで検索してみましたか?そこにたくさんの例があるようです。 –

答えて

4

私がこれにアプローチする方法は、もう1つの整数パラメータ(冪級数に含める項の数)を取る別の関数sine(double X, int n)を持たせることであろう(つまり、この再帰に対しても良い解が存在する)。近似。次に、この関数は[nth term in series] + sine(X, n - 1)のようなものを返すことができます(n = 1を扱うためにはifの前の文を覚えておいてください)。

+0

これは私がやったことだと思います。私はラッパー関数を使用しました。 – SimplyZ

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; 
    } 
} 

しかし、私はすべてでこれを行うことをお勧めすることはできません。