我正在尝试编写一个使用泰勒系列计算正弦的递归代码,我不允许使用Math.sin
。当泰勒级数的下一个项小于0.0000001时,程序应终止。
问题是我一遍又一遍地调用函数时不知道如何保存结果。
到目前为止,这是我的代码,但在Taylor系列的下一个术语小于0.0000001之前,它似乎甚至没有回忆起来:
public static double sin(double x, int y, int i) {
if (i % 2 == 0) {
if ((P(x, y) / F(y)) < 0.0000001) {
return result;
} else {
return sin(x, y+2, i++) + (P(x, y) / F(y)));
}
} else {
if ((P(x, y) / F(y)) < 0.0000001) {
return result;
} else {
return sin(x, y+2, i++) + (P(x, y) / F(y)) * (-1));
}
}
}
public static double F( int n) {
if (n==0 || n==1) {
return 1;
} else {
return n* F(n - 1);
}
}
public static double P(double x, int y) {
if (y == 0) {
return 1;
}
if (y == 1) {
return x;
} else {
return x * P(x, y - 1);
}
}
要获得结果,您只需使用初始参数调用函数sin(double x,int y,int i),并将返回的值保存为与普通函数一样的变量。
sin函数的第一次调用将在内部调用具有不同参数的其他sin函数,直到此条件为真:(P(x,y)/ F(y))<0.0000001
因此,您应该修改sin函数,而不是返回未定义的变量结果:
public static double sin(double x, int y, int i) {
if (i % 2 == 0) {
if ((P(x, y) / F(y)) < 0.0000001) {
return (P(x, y) / F(y));
} else {
return sin(x, y+2, i++) + (P(x, y) / F(y)));
}
} else {
if ((P(x, y) / F(y)) < 0.0000001) {
return (P(x, y) / F(y));
} else {
return sin(x, y+2, i++) + (P(x, y) / F(y)) * (-1));
}
}
}