Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
递归计算ln(n!)的java方法_Java_Algorithm_Math_Recursion - Fatal编程技术网

递归计算ln(n!)的java方法

递归计算ln(n!)的java方法,java,algorithm,math,recursion,Java,Algorithm,Math,Recursion,如何实现java方法递归计算ln(n!) 这是我的解决方案。我知道这是错误的,但这是到目前为止我想到的唯一解决办法 double func(int n) { double result; if(n == 1) return 1; result = func(n-1) * n; return Math.log(result); } 这是函数返回的结果: func(2) = 0.6931471805599453 (correct) func(3) = 0.732

如何实现java方法递归计算
ln(n!)

这是我的解决方案。我知道这是错误的,但这是到目前为止我想到的唯一解决办法

double func(int n) {
   double result;
   if(n == 1)
     return 1;
   result = func(n-1) * n;
   return Math.log(result);
}
这是函数返回的结果:

func(2) = 0.6931471805599453  (correct)
func(3) = 0.7320993680864453  (should be: 1.79175946922805500081)
func(4) = 1.0744553356380115  (should be: 3.17805383034794561964)

需要注意的是,
ln(n*x)=ln(n)+ln(x)
ln(1)=0

double func(int n) {
   if(n==1)
     return 0;
   return func(n-1) + Math.log(n);
}

需要注意的是,
ln(n*x)=ln(n)+ln(x)
ln(1)=0

double func(int n) {
   if(n==1)
     return 0;
   return func(n-1) + Math.log(n);
}

您需要gamma函数,因为gamma(n)=(n-1)

更棒的是,LNGGamma具有很好的特性,可以计算n/M(n-m)!简单


不要使用学生们非常喜欢的朴素的递归阶乘。如果您返回的类型不是double,那么它的效率很低(Java中没有尾部递归;没有内存化),并且受到限制。最好返回一个double。

您需要gamma函数,因为gamma(n)=(n-1)

更棒的是,LNGGamma具有很好的特性,可以计算n/M(n-m)!简单



不要使用学生们非常喜欢的朴素的递归阶乘。如果您返回的类型不是double,那么它的效率很低(Java中没有尾部递归;没有内存化),并且受到限制。最好返回一个double。

您的解决方案没有错,但是有一些计算方法可以处理较大的
n
而不会溢出。如果您不调用方法本身,则不是递归调用。当然可以。您需要lngamma函数:。本科阶乘实现,特别是递归实现,是错误的<代码>如果(n==1)返回0因为
ln(1!)=ln(1)=0
您的解决方案没有错,但是有一些计算方法可以处理较大的
n
,而不会溢出。如果您不调用方法本身,则不是递归调用。是的,当然。您需要lngamma函数:。本科阶乘实现,特别是递归实现,是错误的<代码>如果(n==1)返回0因为
ln(1!)=ln(1)=0
对于任何与阶乘有关的问题,递归解决方案都很容易编码,但却太天真了。这就是我所说的。。。方法“func”调用自身“func”。这是一个递归调用。我认为这不是一个好主意。你应该明白为什么。@duffymo因为我们要取
n的
ln
n=3
ln(3!)=ln(3*2*1)=ln(3)+ln(2)+ln(1)
。所以,你看,这里并没有真正的阶乘。所以这应该是O(n)
,所涉及的数字会很小……只要n很小。对于较大的值,LNGAMA更好。在任何情况下都应该使用。对于任何与阶乘有关的问题,递归解决方案都很容易编码,但过于天真。这就是我所说的。。。方法“func”调用自身“func”。这是一个递归调用。我认为这不是一个好主意。你应该明白为什么。@duffymo因为我们要取
n的
ln
n=3
ln(3!)=ln(3*2*1)=ln(3)+ln(2)+ln(1)
。所以,你看,这里并没有真正的阶乘。所以这应该是O(n)
,所涉及的数字会很小……只要n很小。对于较大的值,LNGAMA更好。在这两种情况下都应该使用。对于大n,没有尾部递归的递归仍然是低效的。我的观点是有一个更好的方法,一个大多数人都不熟悉的方法。伽玛函数及其与阶乘的关系对于任何研究贝塞尔函数和弗罗贝尼乌斯求解常微分方程的方法的人来说都是众所周知的,但这并不是你的常规开发人员。这是值得知道的。我完全同意你应该这样做(youtube链接),我只是认为可能一次只做一点数学——首先是基本的日志算法,然后再做其他事情……Apache Commons提供了一个。没有尾部递归的递归对于大型n来说仍然是低效的。我的观点是有一个更好的方法,一个大多数人都不熟悉的方法。伽玛函数及其与阶乘的关系对于任何研究贝塞尔函数和弗罗贝尼乌斯求解常微分方程的方法的人来说都是众所周知的,但这并不是你的常规开发人员。这是值得知道的。我完全同意你应该(youtube链接),我只是认为可能一次只做一点数学——首先是基本的日志算术,然后是其他一切……ApacheCommons提供了一个。