需要帮助来发现C程序中的错误

时间:2020-06-30 16:50:06

标签: c recursion

我正在尝试计算C语言中sin(x)的值,但执行后代码:block中出现黑屏,这需要很长时间进行编译和执行。

#include<stdio.h>

float mult(float x, int m, int i) {
  float a = x;
  if (i == m) {
    return x;
  } else {
    i++;
    a = a * mult(x, m, i);
    return a;
  }
}

int fact(int m) {
  printf("%d! ", m); fflush(stdout);

  int b;
  if (m == 1) {
    return 1;
  } else {
    b = m * fact(m - 1);
    return b;
  }
}

float term(float x, int m) {
  float a = 0, b = 0, c = 0;
  int i = 0;
  a = mult(x, m, i);
  b = fact(m);
  c = a / (1.0 * b);
  return c;
}

float sinof(float x, int m, int n) {
  float b = 0;
  if (m >= 10) {
    return (0);
  } else {
    printf("......%d  ", m); fflush(stdout);
    b = term(x, m);
    m = m + 2;
    n = -n;
    b = b + (n * sinof(x, m, n));
    return b;
  }
}

int main() {
  float x = 0, sin = 0;
  int m = 1, n = 1;
  printf("Enter the angle in radians:");
  scanf("%f", &x);
  sin = sinof(x, m, n);
  printf("%f", sin);
}

我希望逻辑是正确的。

1 个答案:

答案 0 :(得分:1)

m很奇怪。下面无法停止递归。

if(m==10){  // Never true 
    return(0);
} else{
  b=term(x,m);
  m=m+2;n=-n;  // ***********
  b=b+(n*sinof(x,m,n));
  return b;
}

我建议OP首先让自己的代码工作。还有很多其他问题。
要获得简化的递归sine(),请将鼠标悬停以查看。

静态double my_sin_helper(double xx,double term,unsigned n){
if(term + 1.0 == 1.0){
返回条款;
}
返回项-my_sin_helper(xx,xx * term /(((n + 1)*(n + 2)),n + 2);
}

//对[-pi / 2 + pi / 2]有效
double my_sin_primary(double x){
返回x * my_sin_helper(x * x,1.0,1);
}