使用MacLaurin级数用Java递归计算e^x

使用MacLaurin级数用Java递归计算e^x,java,recursion,Java,Recursion,我需要编写一个递归java方法,用签名计算e^x,称为ex,n public static double eThree(double x, long n) 它必须使用麦克劳林级数来计算e^x,这是以下观察结果: 1 + x(1 + x/2( 1 + x/3(1 + x/4(1 + ... )))) e(x,0)= 1 A call to this would return a result of 1 在前面的帮助下,我能够制作一个不需要这种格式的,但是我不确定我会编写什么代码来使用上面的格

我需要编写一个递归java方法,用签名计算e^x,称为ex,n

public static double eThree(double x, long n) 
它必须使用麦克劳林级数来计算e^x,这是以下观察结果:

1 + x(1 + x/2( 1 + x/3(1 + x/4(1 + ... ))))
e(x,0)= 1 A call to this would return a result of 1

在前面的帮助下,我能够制作一个不需要这种格式的,但是我不确定我会编写什么代码来使用上面的格式。谢谢大家,非常感谢大家的帮助

这对你有用吗?我相信它实现了算法,但它不会产生x^n

public static double eThree(double x, long n) {
    return eThree(x, n, 1);
}

private static double eThree(double x, long n, int div) {
    double d = 1;
    if (n > 0) {
        d = d + (x / div) * (eThree(x, n - 1, div + 1));
    }
    return d;
}
它似乎认为:

2^0 = 1.0
2^1 = 3.0
2^2 = 5.0
2^3 = 6.333333333333333
2^4 = 7.0
2^5 = 7.266666666666667
2^6 = 7.355555555555555
2^7 = 7.3809523809523805
2^8 = 7.387301587301588
2^9 = 7.388712522045855

但是现在无法测试。

如果我理解正确,这里的n应该表示McLaurin系列的精度,即我们计算的项数。在这种情况下,您应该在每次递归调用该方法时递减n计数器。你可以这样写:

public static double eThree(double x, long n) {
  return eThreeRec(x, n, 1);
}

public static double eThreeRec(double x, long n, long i) {
  if( i >= n ) {
    return 1.0;
  } else {
    return 1.0 + (x/i) * eThreeRec(x, n, i + 1);
  }
}

n是e将被提升的力量。我曾经知道这件事。。。你应该先自己尝试一下,然后发布你的代码。如果你让它工作,那么很好,如果不是,那么它给了我们一些开始的东西。我相信x应该是传递的基数,然后n是幂。这不是e^x。这个公式是专门用来计算的。请先弄清楚你想要什么。如果你想要公式的值,那么你的方法应该只取一个参数。@Vimzy通常,x是幂,n是估计e^x的项数。这在一些测试中是有效的,但当x为1.0,有6个项数时,我的测试仪返回一个false,因此它不起作用,当x为1.0,有14个项时,我也得到了一个false。是的,n参数有问题。我们实际上应该增加它,而不是减少它!正如@OldCurmudgeon的回答所述,这似乎需要一种辅助方法。不管怎样,我会修正这个答案。是的,这确实起到了作用。我想知道我的代码在做什么。你能带我走过去吗?@Vimzy-把你的方程看作1+x/1*1+x/2*1+x/3*1+x/4*1+。双参数版本使用除数为1的三参数版本。然后,三参数版本使用递归,将n减少1,并将除数增加1,直到n=0。
public static double eThree(double x, long n) {
  return eThreeRec(x, n, 1);
}

public static double eThreeRec(double x, long n, long i) {
  if( i >= n ) {
    return 1.0;
  } else {
    return 1.0 + (x/i) * eThreeRec(x, n, i + 1);
  }
}