Java 提高递归的性能

Java 提高递归的性能,java,algorithm,performance,recursion,biginteger,Java,Algorithm,Performance,Recursion,Biginteger,我想计算一个序列的大数,它由以下递归描述: x(0,w)=1 x(1,w)=w x(n+1,w)= 2*w*x(n,w)-x(n-1) 我的项目已经用Java实现了,也就是说我需要一个Java解决方案来解决这个问题 其目的是计算x(k,w),其中w之前已经计算过,k,w是大整数。由于k和w是如此大的数字,计算需要大量的时间 我已经实现了一个使用大整数数组列表的解决方案,它只适用于小数字。然后,由于我只需要x(k,w),而不是序列的所有数字,我可以想出以下解决方案,这仍然是一个很大的缓慢: Bi

我想计算一个序列的大数,它由以下递归描述:

x(0,w)=1
x(1,w)=w
x(n+1,w)= 2*w*x(n,w)-x(n-1)
我的项目已经用Java实现了,也就是说我需要一个Java解决方案来解决这个问题

其目的是计算x(k,w),其中w之前已经计算过,k,w是大整数。由于k和w是如此大的数字,计算需要大量的时间

我已经实现了一个使用大整数数组列表的解决方案,它只适用于小数字。然后,由于我只需要x(k,w),而不是序列的所有数字,我可以想出以下解决方案,这仍然是一个很大的缓慢:

BigInteger TWO = new BigInteger("2");

BigInteger x_2 = BigInteger.ONE;
BigInteger x_1 = w;

BigInteger x_0 = BigInteger.ZERO;

for(BigInteger i = BigInteger.ONE; i.compareTo(k) < 0; i = i.add(BigInteger.ONE)) {
        x_0 = w.multiply(TWO).multiply(x_1).subtract(x_2);

        x_2 = x_1;
        x_1 = x_0;

    }

return x_0;
但Java并没有提供计算BigInteger/BigDecimal对象的幂或平方根的实现方法。人们可以避免计算平方根,因为它们稍后会被抵消。但是,我们必须计算二项式系数。因此,我不确定应该实施哪些方法


你能告诉我,你认为计算x(k,w)最快和最有效的方法是什么吗?

n
-th项是前两项的线性组合,所有
n
的系数都相同,因此你可以找到矩阵的
n
-th次方
[[2*w,-1],[1,0]]
并将其乘以向量
[x\u 1,x\u 0]
。如果使用二进制矩阵求幂,则需要
O(logn)
乘法和加法。此解决方案仅使用整数,因此绝对精确

尝试预先计算x(n,w)的低值,并将其存储在
地图中。如果将预计算限制为
int
long
值,则它将运行得更快;只需转换为
biginger
,然后将结果存储在
映射中。您还需要实现不同的方法和运行计时来检查速度。您的标题询问了递归,但您所展示的代码似乎是迭代的。我不太确定,使用长值的预计算是否可行。在某些情况下,k是一个大于530000的数字。也就是说,使用整数进行预计算只会减少整个计算时间的一小部分。
x(n,w)=1/2*((w+sqrt(w^2-1)^n+(w-sqrt(w^2-1)^n)