使用C中的递归函数的正弦值

时间:2018-03-20 01:40:41

标签: c

我得到消极和积极的结果:当我输入(n值奇数)时,奇数项产生偶数或偶数项产生奇数值。我已经为factorial做了功能,它运行正常。

#include <stdio.h>
#include <math.h>
#define PI 3.14159f

int factorial(int n);
float sine(float , int);
int i;

void main(){
    float degree;
    float radian;
    float result;
    int n;
    printf("Enter the angle in degree: ");
    scanf("%f",&degree);
    printf("Enter the iteration: ");
    scanf("%d",&n);
    radian = degree * PI / 180;
    result = sine(radian,n);
    printf("%d",factorial(n));
    printf("\n");
    printf("sin%.2f = %.3f",degree,result);
}

int factorial(int n)
{
    if(n==0)
        return 1;
    else if (n==1)
        return 1;
    else
        return (n*factorial(n-1));
}

float sine(float an, int n)
{
    if (an==0)
        return 0;
    else if(n>=0)
        if(n%2==1)
            return (sine(an,n-2) - pow(an,n)/factorial(n)) * pow(-1,n);
        else
            return (sine(an,2*n-1) - pow(an,2*n+1)/factorial(2*n+1)) *-1 ;
}

1 个答案:

答案 0 :(得分:1)

#include <iostream>
using namespace std;

int main()
{
    char ch;
    while (cin >> ch){
        cout << ch; 
    }
   return 0;
}

上述条件为sin(0)返回0,因此在递归的其余部分没有用,并且它工作正常。

float sine(float an, int n)
{
    if (an == 0)
        return 0;

让我们通过替换n的值来查看函数的这一部分的位置: 假设我们从degree = 30开始,迭代次数= 3
然后:

else if(n >= 0)
    if(n%2 == 1)
        return (sine(an,n-2) - pow(an,n)/factorial(n)) * pow(-1,n);
    else
        return (sine(an,2*n-1) - pow(an,2*n+1)/factorial(2*n+1)) *-1 ;

n很奇怪,所以函数返回:

n = 3;

n又是奇数,所以函数返回:

((sine(an, 3-2) - (float)pow(an, 3) / factorial(3)) * -1);
n = 1;

这一次((sine(an, 1-2) - (float)pow(an, 1) / factorial(1)) * -1); n = -1; 因此if-else条件被跳过并且返回了一些垃圾值,因为您没有告诉您的程序在n < 0返回什么 所以你需要你的正弦函数在n = 0

时返回一个默认值 对于n的奇数值,

n = 0将始终返回-1,对于n的偶数值,将始终返回1。因此,sine()函数的输出符号不会像系列中那样交替变化。

回答评论:为什么标志似乎改变为奇数或偶数,
在你的代码中,n的数值是跳过偶数,而不是每次调用减少1,你只传递奇数。
pow(-1,n) 所以你最终得到的是一些负面因素;当你以n为2的偶数值开始时,则第二次用奇数值n调用sine(),这是(2 * n-1),它再次返回负数之和。

继承你能做什么:

return (sine(an,n-2) - pow(an,n)/factorial(n)) * pow(-1,n);