Fibonacci线性时间递归

时间:2014-11-02 02:27:22

标签: recursion dynamic-programming fibonacci

为什么这只能达到n = 90左右? 试图计算第94个斐波纳契数给出了不正确的结果。 如果我使用Integer类而不是Long,也会发生同样的事情。

import java.util.HashMap;

public class FDP {

    private static HashMap<Long, Long> fib = new HashMap<Long, Long>();

    private static Long calculateFib(Long n) {

        if(fib.get(n)==null){
            Long temp = calculateFib(n-1) + calculateFib(n-2);
            fib.put(n, temp);
            return temp;
        }
        else{
            return fib.get(n);
        }
    }
    }

    public static void main(String[] args) {
        fib.put(0L, 0L);
        fib.put(1L, 1L);
        System.out.println(calculateFib(90L)); //success
        System.out.println(calculateFib(94L)); //garbage??
    }
}

这是Fibonacci数字列表:

http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibtable.html

2 个答案:

答案 0 :(得分:1)

它溢出了。 第94个斐波纳契数是:19740274219868223167 Long.MAX_VALUE是: 9223372036854775807

19740274219868223167 - 9223372036854775807 > 0

您可以使用BigInteger来处理任意长度的数字。

答案 1 :(得分:1)

您达到 Long (64位)类型的限制,请改用 BigInteger