使用BigIntegers和memoization调用递归方法时获取NULL

时间:2017-09-08 16:24:41

标签: java recursion biginteger memoization

我使用long数据类型工作的方法,但是当我去调用我的BigInteger递归方法时,当我打印它时它会显示“null”。 这是我的长递归方法,对我有用:

public static long fib_rec(int n){
    long result=1;
    if(n<=2){
        return result;
    }
    else{
        if(fval[n]!=0){
            result=fval[n];
        }
        else{
            result = fib_rec(n-1) + fib_rec(n-2);
            fval[n] = result;
        }
        return result;
    }
}

同样,该方法完美无缺,直到我越过n = 94,其中值对于长数据类型而言太大。 这是我的BigInteger尝试,完整的程序:

public class BigInt {

    static BigInteger[] fval;

    public static void main(String[] args) {

        int index;

        Scanner input = new Scanner(System.in);

        index = input.nextInt();

        fval = new BigInteger[index + 1];


        System.out.println(fib_rec(index));
    }

    public static BigInteger fib_rec(int index){

        BigInteger result = BigInteger.ONE;

        if(index <= 2){
            return result;
        }

        else{
            if(fval[index] != BigInteger.ZERO){
                result=fval[index];
            }
            else{
                 result = fib_rec(index-1).add(fib_rec(index-2));

                fval[index] = result;

            }
            return result;
        }
    }  
  }

这会返回null,我不知道为什么......

1 个答案:

答案 0 :(得分:2)

你假设一个BigInteger数组开始用长数组填充零,但它开始充满空值,因为它是一个对象数组,所以这个:

if(fval[index] != BigInteger.ZERO){
    result=fval[index];
}

将始终返回null,因为null值不等于BigInteger.ZERO

如果你添加:

for (int i = 0; i < index+1; i++) {
  fval[i] = BigInteger.ZERO;
}

在致电fib_rec之前,它可以运作。