2012-04-26 58 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 2012-04-26 21:01:34

+0

@它有一个家庭作业标签....也许刚刚添加? – kenny 2012-04-26 21:02:22

+0

你有没有试过Google?似乎有很多例子 – 2012-04-26 21:02:29

回答

4

我会采取的方法是使用另一个函数sine(double X, int n),它需要另一个整数参数 - 要包含在幂级数中的项数近似。然后这个函数可能返回类似[nth term in series] + sine(X, n - 1)(只记得之前的if声明来处理n = 1)。

+0

我认为这就是我所做的。我使用了一个包装函数。 – SimplyZ 2012-04-26 21:52:12

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

但我不能推荐在所有这样做。 (即使对于这种递归也有更好的解决方案,但是可以自己找到它们)