如何实现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)
答案 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的类型,它是有限的。最好还给双人。