我一直在与这个代码斗争,只是似乎没有领会我做错了什么。
该代码假设计算:模式为[(-1)^i(x)^2i]/(2i)的一系列“余弦”之和!
这是我到目前为止的代码:

#include <stdio.h>
#include <math.h>

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

int main (){
    float i, n;
    float sum=0;
    printf("Enter desired interger: ");
    scanf("%f", &n);

    for (i=0; i<=1; i++)
        sum = sum + (pow(-1,i)*pow(n,2*i))/(factorial(n));

    printf("The value is %f\n", sum);
    return 0;
}

我仍在努力,任何信息或帮助将非常感谢!
编辑:
刚修好,伙计们,这是我的教授必须使用的新格式:
#include <stdio.h>
#include <math.h>
int factorial(int n)
{
if (n==0) return 1;
else
return n*factorial(n-1);
}
float mycos(float x)
{
float sum=0;
int i;
for (i=0;i<=10;i++) sum = sum + (pow(-1,i)*pow(x,2*i))/factorial(2*i);
return sum;
}
int main()
{
int i=1;
printf("     x    mycos(x)   cos(x)\n");
for (i=1;i<=10;i++)
printf(" %f %f %f\n", i*.1, mycos(i*.1), cos(i*.1));
return 0;
}

谢谢你们的解释,他们帮了大忙!

最佳答案

我看到的一件事是,main中的for循环只运行两次真正的迭代,一次是I==0,另一次是I==1。
为了使泰勒展开更有效地工作,它需要运行更多的序列项(更多的循环迭代)。
我看到的另一件事是,你的分母是n而不是(2*n)!
为了提高效率,我还可以实现阶乘例程,如下所示:

unsigned int factorial(int n){
    unsigned int product = 1;

    for(int I = 1; I <= n; I++) product *= I;

    return product;
}

上面的阶乘例程是为了更精确的阶乘计算,也许您不需要这样做就您的目的而言,浮点变量可能已经足够好了。
float factorial(int n){
    float product = 1;

    for(int I = 1; I <= n; I++) product *= (float)I;

    return product;
}

我还应该注意为什么我要声明以这种方式执行阶乘。一般来说,循环构造比递归构造更有效您当前的实现是递归的,因此我提供的实现从性能和内存利用率上都应该更高效一些。

关于c - 处理代码以阶乘和计算余弦,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22050980/

10-14 19:14