当" n"的值时,递归函数需要花费太长时间才能运行很大

时间:2014-07-14 10:48:35

标签: java recursion biginteger

我正在努力获得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);
            }
     }
}

2 个答案:

答案 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