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

时间:2016-08-24 20:23:35

标签: 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.7320993680864453  (should be: 1.79175946922805500081)
func(4) = 1.0744553356380115  (should be: 3.17805383034794561964)

2 个答案:

答案 0 :(得分:4)

需要注意的是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);
}

答案 1 :(得分:1)

你想要伽玛函数,因为gamma(n)=(n-1)!

https://en.wikipedia.org/wiki/Gamma_function

更好的是,lngamma具有很好的属性,可以计算n!/ m!(n-m)!容易。

不要使用学生非常喜欢的天真递归因子。这是低效的(Java中没有尾递归;没有memoization),如果你返回一个非double的类型,它是有限的。最好还给双人。