2012-04-26 2 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

인터넷 검색을 시도해 보셨습니까? 밖에 많은 예제들이있는 것 같습니다. –

답변

4

나는 다른 방법이 될 것이라고 접근 방식은 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; 
    } 
} 

그러나 나는 전혀이 일을 권장하지 않습니다. (심지어이 재귀에 더 나은 솔루션이 있지만 자신에 그들을 찾을 수)