BigInteger的.equals()方法无法正常工作

时间:2015-09-26 19:28:59

标签: java

最近,我尝试用Fibonacci序列进行动态编程。 (使用BigInteger s)

无论我输入什么号码,它都会溢出。 甚至1(我真的不明白。)

所以从我看来,似乎第18-20行由于某种原因没有运行。

我甚至试图让它在if条件中抛出RuntimeException,但程序永远不会从RuntimeException崩溃。它始终从StackOverflowError崩溃,这意味着第18 - 20行从未运行过。 (这也意味着我总是有一个StackOverflowError,因为我的递归永远不会结束。)

我做错了什么?

package cos.view;

import java.math.BigInteger;
import java.util.HashMap;

public class Fibonacci {

    static BigInteger one = new BigInteger("1");
    static BigInteger two = new BigInteger("2");
    static BigInteger three = new BigInteger("3");
    static BigInteger testNumber = new BigInteger("5");
    static HashMap<BigInteger, BigInteger> map = new HashMap<BigInteger, BigInteger>();

    public static void main(String[] args) {
        System.out.println(fibonacci(testNumber, map));
    }

    public static BigInteger fibonacci(BigInteger n, HashMap<BigInteger, BigInteger> map) {
        if (n.equals(0) || n.equals(1)) {
            return n;
        }

        if (map.containsKey(n)) {
            return map.get(n);
        }

        map.put(n.subtract(one), fibonacci(n.subtract(one), map));
        map.put(n.subtract(two), fibonacci(n.subtract(two), map));

        BigInteger nMinusOne = map.get(n.subtract(one));
        BigInteger nMinusTwo = map.get(n.subtract(two));

        BigInteger sumValue = nMinusOne.add(nMinusTwo);
        map.put(n, sumValue);

        return sumValue;
    }
}

2 个答案:

答案 0 :(得分:4)

BigIntegerint进行比较将始终为false,因为它们的类型不同。

您需要比较两个BigInteger

if(n.equals(BigInteger.ZERO) || n.equals(BigInteger.ONE)){
    return n;
}

答案 1 :(得分:1)

查看BigInteger.equals()

的文档
  

返回:       当且仅当指定的Object是BigInteger且其值在数值上等于此BigInteger时才为true。

改变比较元素的方式:

if(n.equals(BigInteger.ZERO) || n.equals(BigInteger.ONE)){
    return n;
}