我正在努力获得n
系列的价值。例如f(n)=2014*f(n-1) + 69*f(n-2)
(n>2)
和f(n)=1
n<=2
。我正在使用BigInteger
,因为这是我的要求。在运行较小值的代码时,我得到了答案。当n
超过123时我没有得到结果。代码中的任何修改或缩小的方式运行时间??
public class test {
public static BigInteger FindSumDigit (BigInteger number) {
BigInteger one = new BigInteger("1");
BigInteger two = new BigInteger("2");
BigInteger result, zero = new BigInteger("0");
BigInteger a = new BigInteger("2014");
BigInteger b = new BigInteger("69");
if(number.equals(one))
return one;
else if (number.equals(two))
return one;
else
return a.multiply(FindSumDigit(number.subtract(one))).add(b.multiply(FindSumDigit(number.subtract(two)))); //finding the n-th element
}
public static void main(String args[]) {
Scanner s = new Scanner(System.in);
int N = s.nextInt();
BigInteger q[] = new BigInteger[N];
if(1 <= N && N < 10)
for(int i = 0; i < N; i++) {
BigInteger n = s.nextBigInteger();
BigInteger o = FindSumDigit(n);
System.out.println(o);
}
}
}
答案 0 :(得分:4)
下面的递归函数是线性递归或&#34; Fibonacci类序列的一个例子。&#34;
f(n)=2014*f(n-1) + 69*f(n-2) for (n>2)
虽然这个函数是自然地递归定义的,但是将这个数学定义直接转换为程序是 NOT 使用递归的典型例子。实际上,计算机需要为给定输入n进行的函数调用的数量本身就是斐波纳契数列!由于第n个斐波那契数约为((1 + sqrt(5))/ 2)^ n,因此函数调用的数量呈指数增长。对于小的n值,这不重要。但在某一点之后,计算机将锁定或抛出StackOverflow异常。
这是一个避免此问题的非递归解决方案:
static BigInteger a = new BigInteger("2014");
static BigInteger b = new BigInteger("69");
public static BigInteger computeNthTerm(int n) {
BigInteger prev1 = new BigInteger("1");
BigInteger prev2 = new BigInteger("1");
BigInteger nth = new BigInteger("1");
for(int k=2; k<n; k++) {
nth = prev2.multiply(a).add( prev1.multiply(b) );
prev1 = prev2;
prev2 = nth;
}
return nth;
}
答案 1 :(得分:1)
这是二阶线性递归,并且有一个封闭的形式解,请看这里例如http://mathworld.wolfram.com/LinearRecurrenceEquation.html