最近,我尝试用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;
}
}
答案 0 :(得分:4)
将BigInteger
与int
进行比较将始终为false
,因为它们的类型不同。
您需要比较两个BigInteger
:
if(n.equals(BigInteger.ZERO) || n.equals(BigInteger.ONE)){
return n;
}
答案 1 :(得分:1)
返回: 当且仅当指定的Object是BigInteger且其值在数值上等于此BigInteger时才为true。
改变比较元素的方式:
if(n.equals(BigInteger.ZERO) || n.equals(BigInteger.ONE)){
return n;
}