Mar*_*ark 1 java algorithm math optimization
我得到一个数字 k,我必须从 [0;k] 中找到每个 (2k) 阶乘;例如 0, 2!, 4!, 6! 等。我尝试了一个解决方案,将值保存在地图中,并为每个第 k 个值使用第 (k-1) 个结果,如下所示:
private Map<Long, BigInteger> cache;
private FactorialCache(int k) {//
cache = new HashMap<>();
calculate(k);
System.out.println("last item " + k);
}
private void calculate(int k) {
BigInteger result = BigInteger.ONE;
cache.put(0l, result);
cache.put(1l, result);
for (long i = 2; i <= k; i += 1) {
BigInteger currentRes = cache.get(i - 1).multiply(BigInteger.valueOf(i));
cache.put(i, currentRes);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我很好奇是否有更快的方法来查找和保存这些特定阶乘?
这不是一个答案,而是一个扩展的评论。
如果您的目标是计算阶乘,那么您就不可能变得更快。但是,我认为这个问题是在您上一个问题的上下文中提出的,关于某个系列的总和,
?(2k+1)/(2k)! , k =0,... ,?
Run Code Online (Sandbox Code Playgroud)
如果我是对的,答案是根本不计算阶乘。改用霍纳时间表。你的总和可以表示为
1 + 1/(1*2)(3 + 1/(3*4)(5 + 1/(5*6)(7 + 1/(7*8)(9 + ...)))...)))
Run Code Online (Sandbox Code Playgroud)
看看阶乘是如何消失的。现在修正一些你想添加的术语,然后彻底处理这个表达式。
查找多个术语以达到所需的精度是一个完全不同的主题。正如我在评论中提到的,泰勒定理非常有用。